前面的22个常用的设计模式现已学习完毕,大家可以看到22个设计模式中提及到了带有“工厂”性质的相关模式,例如:构建方法、静态构建(或工厂)方法、工厂方法、抽象工厂、简单工厂等。类似这些模式,我们拿出来将其概念跟他们之间的区别进行比较跟说明。
- 抽象工厂模式
抽象工厂模式是一种创建型模式,它能创建一系列相关或相互依赖的的对象而无需指定其具体类。那么有人要问,什么是“系列对象”?那接下来我将用生活中具体的示例来解释清楚这种概念。
例如有这样的一组对象:运输工具-引擎-控制器
- 汽车 涡轮发动机 方向盘
- 飞机 喷气式发动机 操纵杆
注:如程序中不涉及具体产品系列的话,那就不需要使用抽象工厂。
- 工厂方法模式
工厂方法模式是一种创建型模式,其在父类中提供创建对象的方法,允许子类实例化对象的类型。
如果在基类及其扩展类中都有一个构件方法的话,他可能就是工厂方法模式。
- 简单工厂模式
简单工厂模式描述了一个类,他包含了拥有大量条件语句的构建方法,可工具方法的额参数来选择对哪种产品进行初始化将其返回。
人们通常将简单工厂与普通的工厂或其他创建型设计模式混淆。在绝大多数情况下,简单工厂是引入工厂方法或抽象工厂模式时的一个中间步骤。
简单工厂通常没有子类。但当从一个简单的工厂中抽取出子类后,他看上去就会更像经典的工厂方法模式了。
注:如果你讲简单工厂声明为abstract类型,他并不会变为抽象工厂模式。
- 静态构建方法
静态构建方法是被声明为static的构建方法。意思就是你无需创建对象就能在某些类上调用该方法。
不要因为某些人将这些方法称为“静态工厂方法”而被迷惑,这种称呼并不好,工厂方法是一种依赖于继承的设计模式。如果将他设置为static,你就不能在子类中对其进行扩展,这就破坏了该模式的目的。
当静态构建方法返回一个新对象时候,它就成为构造函数的替代品。
- 构建方法
构建方法被定义为“创建对象的方法”。这意味着每个工厂方法模式的结果都是“构建方法”,但反过来则并非如此。这意味着你可以用“构建方法”来代替在重构中使用的“工厂方法”和“静态工厂方法”。
在实际中,构建方法只是构造函数调用的封装器。它可能只是一个能更好地表达意图的名称。此外,它可以让你的代码独立于构造函数的改动,甚至还可以包含一些特殊的逻辑。返回已有对象以而不是创建新对象。
许多人会仅仅因为这些方法创建了新对象而称之为“工厂方法”。其中的逻辑很好理解:所有的工程都会创建对象,而该方法会创建对象。所以显然它是一个工厂方法。但是当你正在遇到真正工厂方法时候,这将造成许多混淆跟迷惑。