对于简单工厂,工厂方法,抽象工厂比较容易混淆,在这很有必要总结一下这三种设计模式的特点、相同之处和不同之处。
1 本质:
这三种设计模式的名字中都含有“工厂”二字,其含义是使用工厂(一个或一系列方法)去生产产品(一个或一系列类的实例)。
另外,有时候,我们常常会将生产产品的一个或一系列方法封装到一个类中,我习惯把这个类叫做“工厂类”;而被实例化的类称作“产品类”。
2 简单工厂:
简单工厂拥有一个工厂方法(createProduct),接受了一个参数产品类名(QString),通过不同的参数实例化不同的产品类。
简单工厂UML图如下所示:
优点:
简单工厂的特点“简单粗暴”,我们可以把任何有颜色和形状的产品通过该工厂类生产出来,上至飞机火箭,下至土豆面条,只要任何有形状和颜色的东西都可以生产出来。所以也可以把简单工厂称为上帝类。
缺点:
(1)工厂类负担太重。当我们要生产的东西越来越多的时候,工厂方法的代码量可能会很庞大。
(2)在遵循开闭原则(对拓展开放,对修改关闭)的条件下,简单工厂对于增加新的产品,无能为力。因为增加新产品只能通过修改工厂方法来实现。
3 工厂方法:
工厂方法针对每一个产品提供对应的工厂类,通过不同的工厂实例来创建不同的产品实例。
如下边UML类图所示为工厂方法。
优点:
(1)工厂方法模式减轻了工厂类的负担,把某一类/某一种东西指定一个工厂进行生产使得每个工厂职责清晰;
(2)当要增加某一类”东西“并不需要修改工厂类,只需要增加这类”东西“的工厂即可,符合开放-封闭原则。
缺点:
(1)由于每增加一个产品就得相应的增加工厂,对于某些可以形成产品族的情形,不便于代码可扩展和可维护
4 抽象工厂:
抽象工厂模式定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。所以抽象工厂适用于产品间有互相影响的。
抽象工厂UML图如下:
对应的产品族可如下表示