工厂方法模式
将模板方法模式用于生成实例,模板方法模式就演变为工厂方法模式。但是也失去了模板方法模式最核心的概念:父类中的
templateMethod定义了不可变的处理流程(核心算法),不允许子类重写该方法。
类图

简化模板方法
把模板方法中的示例代码进行简化,如下:
此时,上述代码已经实现了工厂方法模式,A 类和 B 类就是两个具体的工厂。但是该工厂创建的是 void,因为 step1() 没有返回值。
继续改造代码
- 给定返回值
- 修改函数名和类名,让其更加表意
- 修改
templateMethod方法名,让其更加表意
创建 string 的工厂
createProduct 可以返回(创建)不同类型的数据,此处把返回值限定为一个字符串(可以理解为一个创建字符串的工厂),具体的创建逻辑交给子类负责。
和模板方法不同,由于不需要在父类中规定算法流程,所以上述的
StringFactory可以用接口来代替。
把 string 产品化
各种教材上所说的:工厂方法模式主要用于定义一个接口用于创建对象,但让子类来决定哪个类进行实例化。此时可以把 string 变成一个类(即所谓的产品),即 ShortString 和 LongString。
创建 Button 产品的工厂
这是另一示例,此处的产品是 Button。这个示例中使用接口作为抽象工厂。
如果在上述代码的基础上,引入另一个产品 checkbox,则产品一共有:WinButton、MacButton、WinCheckbox、MacCheckbox。对于这种情况,需要引入抽象工厂模式。