1. 意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
工厂方法使一个类的实例化延迟到其子类。
2. 四种角色
抽象产品、具体产品、抽象构造者、具体构造者
3. 优点
3.1 仅处理抽象产品(Product)接口
3.2 给子类一个钩子(hook)以提供对象的扩展版本(父类有个缺省版本)
3.3 可以连接平行的类层次(职责委托)
4. 缺点
4.1 可能为了创建一个特定的具体产品对象,不得不创建一个具体构造者。
5. 相关模式
5.1 抽象工厂经常用工厂方法来实现
5.2 工厂方法通常在模板方法中被调用
5.3 原型不需要创建Creator子类,但需要Creator初始化产品对象,工厂方法则不需要。
6. 代码示意(C++)
#pragma once#include using namespace std;class Product{public:virtual void Operation1() = 0;virtual void Operation2() = 0;};class ConcreteProduct1 : public Product{public:virtual void Operation1() {cout << "ConcreteProduct1:操作1" << endl;}virtual void Operation2() {cout << "ConcreteProduct1:操作2" << endl;}};class ConcreteProduct2 : public Product{public:virtual void Operation1() {cout << "ConcreteProduct2:操作1" << endl;}virtual void Operation2() {cout << "ConcreteProduct2:操作2" <Operation1();delete pProduct;}void Operation2(){Product* pProduct = FactoryMethod();pProduct->Operation2();delete pProduct;}public:virtual Product* FactoryMethod() = 0;};class ConcreteCreator1 : public Creator{public:virtual Product* FactoryMethod() {return new ConcreteProduct1;}};class ConcreteCreator2 : public Creator{public:virtual Product* FactoryMethod() {return new ConcreteProduct2;}};
#include "Creator.h"int main() {Creator* pCreator = new ConcreteCreator1;Product* pProduct = pCreator->FactoryMethod();pProduct->Operation1();pProduct->Operation2();delete pProduct;delete pCreator;pCreator = new ConcreteCreator2;pCreator->Operation1();pCreator->Operation2();delete pCreator;return 0;}
运行结果:
6.1 可以直接操作Product的接口(3.1),也可以通过Creator操作
6.2 增加ConcreteProduct3,需要增加对应的ConcreteCreator3(4.1)