工厂方法
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将“哪一个帮助子类是代理者”这一信息局部化的时候。
结构
Product - 定义工厂方法所创建的对象的接口。
ConcreteProduct - 实现Product接口。
Creator - 声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
ConcreteCreator - 重定义工厂方法以返回一个ConcreteProduct实例。
协作:
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
示例代码
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
| #include <iostream>
class Product{};
class ConcreteProduct1 : public Product { public: ConcreteProduct1() {std::cout<<"ConcreteProduct1"<<std::endl;} };
class ConcreteProduct2 : public Product { public: ConcreteProduct2() {std::cout<<"ConcreteProduct2"<<std::endl;} };
class Creator { public: virtual Product* create_product() = 0; };
template <typename TheProduct> class ConcreteCreator : public Creator { public: virtual Product* create_product(); };
template <typename TheProduct> Product* ConcreteCreator<TheProduct>::create_product() { return new TheProduct; }
int main() { ConcreteCreator<ConcreteProduct1> my_creator1; my_creator1.create_product(); ConcreteCreator<ConcreteProduct2> my_creator2; my_creator2.create_product(); system("Pause"); }
|
相关模式
- Abstract Factory经常用工厂方法来实现。
- 工厂方法通常在Template Methods中被调用。
- Prototypes不需要创建Creator的子类。但是,它们通常要求一个针对Product类的Initialize操作。Creator使用Initialize来初始化对象。而Factory Method不需要这样的操作。
[1] 设计模式:可复用面向对象软件的基础
[2] Head First 设计模式