今天我们来分享工厂模式的简单工厂和工厂方法。在平时的应用开发中,工厂模式是比较常用的一个设计模式,基本上在很多的开源jar中可以看到工厂设计模式的影子。
工厂模式有以下几种形态:
简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个产品类的实例。
下面我们就以文档导入使用不同的文件处理器来简单说明一下:
导入文件处理器
此处写了接口了,抽象类也可以
具体类型的文件处理器
Excel处理
Csv处理
工厂类
工厂类根据文件后缀来决定创建什么文件处理器。
Client
客户端调用示例:
执行结果:
Excel导入文件处理... ...
Csv导入文件处理... ...
这样一个简单工厂的示例就完成了。
简单工厂模式特点
优点:
将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦。把初始化实例时的工作放到工厂里进行,使代码更容易维护。更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
缺点:
简单工厂模式的核心工厂类,这个类集中了所有的产品创建逻辑,需要判断在什么时候创建某种产品,当有新的产品需要增加的时候,不得不修改这个核心工厂类的代码。
如上述示例中,再增加一个Pdf的文件处理器类PdfHandler,就需要在工厂类中增加判断逻辑,如:
另外,简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
上述提到问题,将在工厂方法模式(Factory Method)中得到解决,接下来,一起来看下工厂方法模式。
意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
结构
工厂方法模式的基本结构如下:
这里涉及到的参与者有如下几种:
接下来我们来简单调整一下上述代码,采用工厂方法的模式进行展开。
导入文件处理器
此处写了接口了,抽象类也可以。customized()方法是预留的,先可以忽略。
具体的导入文件处理器
Excel文件处理器
Csv文件处理器
抽象工厂(Creator)
本文使用接口代替了。
具体工厂
Excel文件处理器工厂
Csv文件处理器工厂
Client
运行一下:
Excel导入文件处理... ...
CSV导入文件处理... ...
至此,一个简单的工厂方法模式示例就完成了。
再来看下,对新增加产品如pdf处理器,我们需要做什么呢?
1、新建文件处理器PdfHandler
2、新建一个Pdf创建工厂,用于创建PdfHandler
然后,客户端调用只要:
由此可见:
加入一个新的产品,那么就是向系统中加入这个产品类以及它对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持开闭原则。
简单工厂模式 vs 工厂方法模式
工厂方法模式针对的是一个产品等级结构(此处为导入文件处理器)。
如果需要面对多个产品等级结构(再导入的同时,增加导出文件处理器),怎么办呢?我们在下一篇博文中进行讲解。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。