一,意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
二,别名
虚构造器 Virtual Constructor
三,适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
四,结构
五,示例
如该模式的意图所示,工厂方法模式并不难理解。我们沿用抽象工厂模式的示例例子,观察改用工厂方法模式解决这个问题的区别以及其如何把客户代码从需要实例化的具体类中解耦:
定义工厂方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class { public: virtual ~Creator();
virtual Result* () { Result* p_result = new Result; p_result->SetProductA(MakeProductA()); p_result->SetProductB(MakeProductB()); return p_result; } virtual AbstractProductA* MakeProductA() = 0; virtual AbstractProductB* MakeProductB() = 0; };
class ConcreteCreator1 : public Creator { public:
AbstractProductA* MakeProductA() override { return new ConcreteProductA1; } AbstractProductB* MakeProductB() override { return new ConcreteProductB1; } };
class ConcreteCreator2 : public Creator { public:
AbstractProductA* MakeProductA() override 大专栏 工厂方法FactoryMethod 初步学习笔记="function"> { return new ConcreteProductA2; } AbstractProductB* MakeProductB() override { return new ConcreteProductB2; } };
|
使用工厂方法
1 2 3 4 5 6
| Creator* p_creator1 = new ConcreteCreator1; Result* p_result1 = p_creator1->CreateResult();
Creator* p_creator2 = new ConcreteCreator2; Result* p_result2 = p_creator2->CreateResult();
|
在C++中,可通过使用模板来避免创建子类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| template <typename T_ProductA, typename T_ProductB> class TemplateCreator : public Creator { public:
AbstractProductA* MakeProductA() override { return new T_ProductA; } AbstractProductB* MakeProductB() override { return new T_ProductB; } };
Creator* p_creator3 = new TemplateCreator<ConcreteProductA3, ConcreteProductB3>; Result* p_result3 = p_creator3->CreateResult();
Creator* p_creator4 = new TemplateCreator<ConcreteProductA4, ConcreteProductB4>; Result* p_result4 = p_creator4->CreateResult();
|
另外,可通过参数化工厂方法创建多种产品:
1 2 3 4 5 6
| AbstractProductC* ConcreteCreator::MakeProductC(Type label) override { if (label == 5) return ConcreteProductC5; if (label == 6) return ConcreteProductC6; return Creator::MakeProductC(label); }
|
工厂方法并不只是被Creator调用,工厂方法也常常被运用在并行类层次(一个类将它的一些职责委托给一个独立类)的情况下:
通常,设计以使用工厂方法开始,因为相比于其它创建型模式(需要新的类)工厂方法仅需一个新的操作。当发现需要更大的灵活性时,我们便向其它创建型模式演化。
六,相关