0%

设计模式-创建型-简单工厂

简单工厂是一种创建型设计模式,在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

目的

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

结构

简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。

实现

根据下面代码可以看出,简单工厂的实现要点

  • 用户并不需要指导具体的子类的名称,只需要根据参数来向工厂获取 产品。而用户只用使用 基类指针来指向 工厂创建的子类对象,即多态机制,来完成子类的特定功能。
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
class Phone{
public:
Phone() {};
virtual void run() = 0;
};

class XiaoMi: public Phone{
public:
XiaoMi(){};
virtual void run() override{
cout << "This is xiao mi phone" << endl;
}
};
class Apple: public Phone{
public:
Apple(){};
virtual void run() override{
cout << "This is apple phone" << endl;
}
};
// 简单工厂类,客户使用简单工厂来获取对应的产品
class SimpleFactory{
public:
SimpleFactory(){};
Phone* create(int type){ // 注意返回类型为 基类 指针
switch (type)
{
case 0:
return new XiaoMi();
break;
case 1:
return new Apple();
break;
default:
return nullptr;
}
}
};

int main()
{
SimpleFactory factory = SimpleFactory();
Phone* ptr = factory.create(0);
ptr->run();
delete ptr;
ptr = factory.create(1);
ptr->run();
delete ptr;
return 0;
}