一.简单工厂:
目录:
1. 简介
2. 代码实践
3. JDK简单工厂模式分析
1.简介
定义:由一个工厂对象决定创建出哪一种产品类的实例。广义来讲,也属于工厂方法模式。下一篇文章会提到工厂方法模式。
类型:创建型
适用场景:工厂类负责创建的对象比较少;
客户端只知道传入工厂类的参数,不关心如何创建对象。
优点:只需要传入正确的参数,就可以获取所需要的对象实例,无须知道其创建细节。
劣势:工厂类的职责过重,增加新产品,需要修改工厂类创建对象的逻辑(添加新对象的创建逻辑,后面结合代码理解起来就会容易很多),违背了开闭原则,增加了系统的复杂度;
需要创建的对象过多后,不利于系统的维护。(试想一下,满屏的if-else或者switch-case语句)。
总的来说,如果需要创建的对象较少时,简单工厂是一种较为实用的设计模式,笔者在开发过程中也多次使用到简单工厂。
2.代码实践
接下来我们通过图书出版的案例来演示简单工厂模式:
我们先来看看实现后的类图,后面会根据代码做具体的讲解:
Step1:我们先创建图书接口类,并提供一个
出版
的方法print();Step2:再创建对应的实现类,ArtBook 、MathBook,代表出版书籍的类目**
Step3:创建图书出版类的工厂:
最后我们来测试下简单工厂的使用:
输出如下:
以上,我们通过简单工厂模式的方式创建了Book的具体实现类,屏蔽了父模块对子模块的直接依赖,而是通过类型参数
type
,让后端的工厂类来生成对象。这种方式比较适合对象少的情况,对象多的情况请勿使用。具体可以参考后面的工厂方法及抽象工厂文章。另外,简单工厂模式的风险也显而易见,如果我们需要添加另外图书生产类,就需要修改factory代码,增加了系统的不安全性。还有一点需要说明的是,我们也通过参数传入实现类Class对象,反射去生成对象,避免了对BookFactory类代码的修改。
3.JDK简单工厂模式分析
我们来看看Calendar日期类getInstance方法的实现。
首先还是看下Calendar的UML类图:
接下来我们从Calendar类1672行看看简单工厂的运用:
发现Calendar类的实现,和我们的实现几乎一致。另外仍然需要强调的是,简单工厂仅适用于实现类较少的情况。
简单工厂的实现,在其他的场景下也有不少运用,例如JDBC注册驱动,logback获取具体logger对象等。