Factory Method(工厂方法)

1. Factory Method(工厂方法)

1.1 定义

  工厂方法模式(Factory Method Pattern)又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(PolymorphicFactory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中,即定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

1.2 缺点

  当产品种类过多,由于每一种产品都需要实现一个工厂类,增加了代码量

1.3 c++源码例程

 1 #include<iostream>
 2 using namespace std;
 3 
 4 //定义产品类型
 5 typedef enum{
 6     Product_Type_01,
 7     Product_Type_02
 8 }Product_Type;
 9 
10 //定义抽象产品类
11 class Product{
12 public:
13     virtual string getType() = 0;
14 };
15 
16 //具体产品类01
17 class Product01:public Product{
18 public:
19     Product01():Product(),m_type("Product01"){
20 
21     }
22     string getType(){
23         cout << m_type << endl;
24         return m_type;
25     }
26 private:
27     string m_type;
28 };
29 
30 //具体产品类02
31 class Product02:public Product{
32 public:
33     Product02():Product(),m_type("Product02"){
34 
35     }
36     string getType(){
37         cout << m_type << endl;
38         return m_type;
39     }
40 private:
41     string m_type;
42 };
43 
44 //抽象工厂类
45 class ProductFactory
46  {
47  public:
48      virtual  Product* createProduct() = 0;
49  };
50 
51  //具体创建工厂类
52  class Product01Factory
53  {
54  public:
55      virtual  Product* createProduct(){
56          return new Product01();
57      }
58  };
59 
60   //具体创建工厂类
61  class Product02Factory
62  {
63  public:
64      virtual  Product* createProduct(){
65          return new Product02();
66      }
67  };
68 int main(){
69     Product01Factory* factory01 = new Product01Factory();
70     Product* product01 =  factory01->createProduct();
71     product01->getType();
72 
73     Product02Factory* factory02 = new Product02Factory();
74     Product* product02 =  factory02->createProduct();
75     product02->getType();
76 
77     delete product01;
78     product01 = NULL;
79     delete factory01;
80     factory01 = NULL;
81     delete product02;
82     product02 = NULL;
83     delete factory02;
84     factory02 = NULL;
85 }

 

posted @ 2020-11-03 09:44  昨日明眸  阅读(219)  评论(0)    收藏  举报