一、概述
工厂方法(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、当一个类希望由它的子类决定创建的具体对象时,使用工厂方法模式。