简单工厂模式(Simple Factory Pattern)

简单工厂模式不属于GoF 23种设计模式,学习入门用。它通过定义一个工厂类,根据不同参数返回不同实例,被创建的实例都具有共同的父类。因简单工厂模式创建实例的方法属于静态方法,故也称静态工厂方法模式。属于创建型模式。

特点

只要传入一个正确的参数,就能获取需要的对象,而无需了解创建细节。但是在扩展功能的时候,需要对工厂类进行改写,破坏了开-闭原则。故一般不用,可以借鉴其思想改善设计。

下面是大话数据结构中计算器的简单工厂模式UML表示图

code

工厂方法模式(Factory Method Pattern)

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到子类。与简单工厂模式相比是引入了抽象工厂角色。

具体工厂对象的获取:将具体工厂类的类名存储在配置文件(如XML文件)中,通过读取配置文件获取类名字符串,再使用Java的反射机制,根据类名字符串生成对象。Java反射机制与配置文件读取技术的运用使得系统更灵活。

模式优点

用户只需关心所需产品对应的工厂,无需关心创建细节。
系统假如新产品时,只需添加一个具体工厂和具体产品即可,符合开闭原则。

模式缺点

每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加。实现时可能需要用到DOM、反射等技术,一定程度上增加了系统复杂度。

适用场景

客户端不知道它所需要的对象的类,只需知道对应工厂即可,抽象子类通过子类指定创建哪个对象。

抽象工厂模式(Abstract Factory Pattern)

模式定义

提供一个创建一系列或相互依赖对象的接口,无需指定它们具体的类。主要解决接口选择的问题。围绕工厂与产品,抽象的工厂和抽象的产品提供统一的接口,具体的工厂创建具体的产品,增加产品需要确定抽象产品类,具体工厂类,

code

产品等级结构:抽象产品与具体产品构成产品等级结构,即继承结构
产品族:同一个工厂生产的,位于不同产品等级结构的一组产品

模式特点

抽象工厂的开闭原则具有“倾斜性”:

  • 增加产品族:对于增加新的产品族,抽象工厂模式很好地支持了“开闭原则”,只需要增加具体产品并对应增加一个新的具体工厂,对已有代码无须做任何修改。
  • 增加新的产品等级结构:对于增加新的产品等级结构,需要修改所有的工厂角色,包括抽象工厂类,在所有的工厂类中都需要增加生产新产品的方法,违背了“开闭原则”。因此扩展产品族困难。

适用场景

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,用户无需关心创建的过程,将对象的创建和适用解耦。
产品等级结构稳定,每次使用一种产品族。

总结

抽象工厂模式隔离了具体类的生成,同一个具体工厂生产的对象属于同一个产品族,能够保证客户端始终适用同一个产品族中的对象,如qq不同风格的皮肤,Java的AWT设计。
抽象工厂模式增加产品族方便,增加新的产品结构需要进行大量修改且繁琐。

对switch或if,考虑用反射技术去除,解除分支判断带来的耦合。

声明:本站所有文章均为原创或翻译,遵循署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议,如需转载请确保您对该协议有足够了解,并附上作者名 (Tsukasa) 及原文地址