Factory method(DesignPattern)

Factory method

目的

定义一个用于创建对象的接口,让子类去决定实例化哪一个类

动机

一个框架通过抽象类来定义对象之间的关系,并且客户通过子类来定义相关对象的实现。假设有一个应用框架来显示文档,画图框架显示画图文档等,我们需要具体的子类来重定义创建文档的操作,而这个操作就叫做抽象方法。

使用范围

  • 当一个类不知道它所创建的对象的类的时候;
  • 当一个类希望它的子类来指定创建哪个对象的时候;

效果

  • 工厂方法不会将与特定的应用有关的类绑定到代码中,代码仅仅处理product的接口;
  • 客户为了创建一个product,往往需要创建一个具体的creator;

与abstract factory不同的是,factory method的工厂仅仅是一个方法,而抽象工厂里的工厂是一个类。因此抽象工厂里,客户在使用时,产品本身是固定死的;而工厂方法则需要使用到产品本身(接口)。总结就是,抽象工厂看不到产品,因此需要使用客户端和更换工程,而工厂方法直接使用产品,从而生产产品;

代码示范

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Factory_method.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>

using namespace std;

class Product {
public:
Product() { cout << "Product..." << endl; }
virtual void partA() { cout << "partA..." << endl; }
virtual void partB() { cout << "partB..." << endl; }
};

class derivedPro : public Product {
public:
derivedPro() { cout << "derived Product..." << endl; }
virtual void partA() { cout << "derived partA..." << endl; }
virtual void partB() { cout << "derived partB..." << endl; }
};

class Creator {
public:
Product* getProduct() {
if (_product == 0) {
_product = createProduct();
}
return _product;
}
protected:
virtual Product* createProduct() = 0;
private:
Product* _product;
};

template <class TheProduct>
class standardCreator :public Creator {
public:
virtual Product* createProduct();
};

template <class TheProduct>
Product* standardCreator<TheProduct>::createProduct() {
return new TheProduct;
}

int main()
{
standardCreator<Product> myCreator1;
Product* p = myCreator1.getProduct();
p->partA();
p->partB();

standardCreator<derivedPro> myCreator2;
Product* q = myCreator2.getProduct();
q->partA();
q->partB();
return 0;
}