设计模式之简单工厂模式

一.简单工厂:

目录:

1. 简介

2. 代码实践

3. JDK简单工厂模式分析

1.简介

定义:由一个工厂对象决定创建出哪一种产品类的实例。广义来讲,也属于工厂方法模式。下一篇文章会提到工厂方法模式。

类型:创建型

适用场景:工厂类负责创建的对象比较少;

客户端只知道传入工厂类的参数,不关心如何创建对象。

优点:只需要传入正确的参数,就可以获取所需要的对象实例,无须知道其创建细节。

劣势:工厂类的职责过重,增加新产品,需要修改工厂类创建对象的逻辑(添加新对象的创建逻辑,后面结合代码理解起来就会容易很多),违背了开闭原则,增加了系统的复杂度;

需要创建的对象过多后,不利于系统的维护。(试想一下,满屏的if-else或者switch-case语句)。

总的来说,如果需要创建的对象较少时,简单工厂是一种较为实用的设计模式,笔者在开发过程中也多次使用到简单工厂。

2.代码实践

接下来我们通过图书出版的案例来演示简单工厂模式:

我们先来看看实现后的类图,后面会根据代码做具体的讲解:

image.png

Step1:我们先创建图书接口类,并提供一个出版的方法print();
image.png

Step2:再创建对应的实现类,ArtBook 、MathBook,代表出版书籍的类目**
image.png

image.png

Step3:创建图书出版类的工厂:
image.png

最后我们来测试下简单工厂的使用:
image.png

输出如下:
image.png

以上,我们通过简单工厂模式的方式创建了Book的具体实现类,屏蔽了父模块对子模块的直接依赖,而是通过类型参数type,让后端的工厂类来生成对象。这种方式比较适合对象少的情况,对象多的情况请勿使用。具体可以参考后面的工厂方法及抽象工厂文章。另外,简单工厂模式的风险也显而易见,如果我们需要添加另外图书生产类,就需要修改factory代码,增加了系统的不安全性。
还有一点需要说明的是,我们也通过参数传入实现类Class对象,反射去生成对象,避免了对BookFactory类代码的修改。

3.JDK简单工厂模式分析
我们来看看Calendar日期类getInstance方法的实现。
首先还是看下Calendar的UML类图:

image.png

接下来我们从Calendar类1672行看看简单工厂的运用:
image.png

发现Calendar类的实现,和我们的实现几乎一致。另外仍然需要强调的是,简单工厂仅适用于实现类较少的情况。
简单工厂的实现,在其他的场景下也有不少运用,例如JDBC注册驱动,logback获取具体logger对象等。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容