对于工厂三姐妹,大家都耳熟能详了,我再来重复一遍吧!
三大工厂包括:简单工厂模式、工厂方法模式、抽象工厂模式。它们各有各的特征,各有各的优点,同属于创建型模式。下面看看它们都有什么拿手绝活吧!
一、简单工厂模式
特征:又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。
应用:用来生产同一等级结构中的任意产品(不支持增加新产品)。
UML类图:
优点:实现责任分割。
弊端:当需要增加新产品时,需要修改工厂类,不符合开放封闭原则。
计算器例子:
二、工厂方法模式
特征:工厂方法模式是针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例。
应用:用来生产同一等级结构中的固定产品(支持增加任意产品)。
UML类图:
优点:克服简单工厂的缺点,完全支持开闭原则。保持了封装对象创建过程的优点。
弊端:每加一个一个产品,就需要加一个产品工厂的类,增加额外的开发量。
计算器例子:
三、抽象工厂类
特征:提供一个创建一系列或相关依赖对象的接口,而无需指定它们具体的类。
应用:抽象工厂模式是一个工厂需要生产两种或者两种以上的不同产品(对于增加新的产品,无能为力;支持增加产品族)。
UML类图:
优点:易于交换产品系列;增加新产品族,支持开闭原则;支持依赖倒转原则。
弊端:增加新的产品等级结构,不支持开闭原则。
四、简单工厂 PK 工厂方法
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。不但对扩展开放了,对修改也开放了,违背了开放封闭原则。
工厂方法模式实现时,客户端需要决定实例哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是该工厂类的,现在改客户端就可以了。
五、工厂方法 PK 抽象工厂
工厂方法模式与抽象工厂模式的区别其实就是两句话:前者只有一个抽象产品类,而后者有多个。前者的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
六、总结
工厂三姐妹真的是神通广大啊,可谓是长江后浪推前浪。可是,千万不要以为抽象工厂是完美的,她有时也需要简单工厂的帮助,她们各有各的优缺点。是否能利用好她们,就要看我们的了!