工厂模式有简单工厂、工厂方法、抽象工厂这三种。本文章将通过UML图分析这是三种模式的优缺点。
场景:一个Car接口,现在有两个实现类BMW、Audi。
1 不使用工厂的情况下
Test类需要知道Car接口和
new BMW、Audi这两个实现类。
每个需要用到实现类(如:BMW)的对象(如:Test)都需要new一个实现类,不符合
开闭原则。
如果很多地方都需要用到Car接口的实现类,那么就可使用一个工厂专门生成这些实现类的实例,
将不符合原则的代码进行封装,只提供符合原则的接口给程序使用,最大限度的减少了不符合原则的代码。
2 使用简单工厂
简单工厂模式也称为静态工厂模式--使用静态方法。
作用:通过接收不同的参数返回不同的实例。
优点(工厂模式的核心本质):
1.实例化对象,用工厂方法代替new操作。
2.将选择实现类、创建对象统一管理和控制。
3.调用者(Test)跟实现类解耦。
缺点:添加新的产品(Benz类--Car接口的实现类),需要修改已有的代码(工厂,CarFactory)。
3 工厂方法
工厂方法可以说是简单工厂的一个升级。
对比二者的UML图会发现,工厂方法与简单工厂的区别在于:
1.将CarFactory类改为CarFactoryImpl接口;
2.添加CarFactoryImpl接口的实现类----AudiFactory、BMWFactory。
优点:
解决了简单工厂模式因添加新产品需要修改文件的缺点。
但是由于工厂方法模式的
结构复杂度、
代码复杂度、
客户端编程难度都比简单工厂要大,
所有一般开发时都是使用简单工厂。
小结:
根据设计理论建议---工厂方法模式;
实际开发--简单工厂模式。
4 抽象工厂模式
抽象工厂模式用于解决:生产不同
产品族的全部产品。
缺点:和简单工厂一样,对增加新的产品,无能为力。
对比抽象工厂模式与对象工厂模式的UML图,发现区别:
工厂的实现类可以使用Seat、Engine等接口的实现进行交叉配置,形成一个新的产品族,同时对现有的代码影响不大。
但是新增一个产品tyre时,则需要修改工厂类中的代码(和简单工厂模式一样)。
5 源代码与UML图下载
源代码:http://download.csdn.net/detail/yy228313/9119815
UML图:http://download.csdn.net/detail/yy228313/9119819