一、概述
工厂方法(Factory Method)模式属于对象创建型模式。
二、意图
定义一个用于对象的接口,让子类决定实例化哪一个类。工厂方法模式可以使类的的实例化延迟到子类。
三、角色
Product:定义工厂方法所创建对象的接口。
ConcreteProduct:实现Product接口。
Creator:定义工厂方法,该方法返回一个Product类型对象。
ConcreteCreator:重新定义工厂方法,返回一个ConcreteProduct类型对象。
四、UML图
五、示例
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
61
62
63
64
65
66
67
|
#include <iostream> // 产品公共抽象类 class Product { public : virtual void operation() = 0; }; // 产品A class ConcreteProductA : public Product { public : virtual void operation() { std::cout << "this is concreteProductA operation()" << std::endl; } }; // 产品B class ConcreteProductB : public Product { public : virtual void operation() { std::cout << "this is concreteProductB operation()" << std::endl; } }; // 工厂方法 class Creator { public : virtual Product* factoryMethod() { return new ConcreteProductA; } }; // 重新定义工厂方法,继承工厂方法Creator class ConcreteCreator : public Creator { public : virtual Product* factoryMethod() { return new ConcreteProductB; } }; int main( int argc, char *argv[]) { //创建一个工厂方法A Creator creatorA; //利用工厂方法,创建对应的产品A Product* productA = creatorA.factoryMethod(); //调用产品A的操作 productA->operation(); //创建一个工厂方法B ConcreteCreator creatorB; //利用工厂方法,创建对用的产品B Product* productB = creatorB.factoryMethod(); //调用产品B的操作 productB->operation(); return 0; } |
六、 优缺点
优点:
1、具有良好的扩展性,当添加新的产品时,只需要实现一个工厂方法类和产品类。
2、具有良好的封装性,客户不需要知道具体产品类是什么类,只需要知道对应的工厂方法类即可。
缺点:
虽然具有良好的扩展性,但是当产品种类多时,需要大量的类,维护不方便
七、适用的场景
工厂方法模式的本质是:将类的实例化交由子类来决定。
1、当一个类不知道它所必需创建的具体对象类时,使用工厂方法模式。
2、当一个类希望由它的子类决定创建的具体对象时,使用工厂方法模式。