Factory Method

工厂方法

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将“哪一个帮助子类是代理者”这一信息局部化的时候。

结构

Factory Method Class
Factory Method Class

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 设计模式