一、简单工厂模式

以汽车厂生产为例子:

  • 工厂角色:(汽车厂)一个静态公有成员方法负责生产符合要求的产品;
  • 抽象产品:是一个抽象类,其派生类有各种各样的产品;
  • 具体产品:汽车car、公交车bus

对应的代码:
SimpleFactory.h

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
#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include <iostream>
#include <string>
using namespace std;
//抽象产品类
class Products
{
public:
virtual void product() = 0;
};

//具体产品
class car : public Products
{
public:
virtual void product()
{
cout << "create car" << endl;
}
};

class bus : public Products
{
public:
virtual void product()
{
std::cout << "create bus" << std::endl;
}
};

//工厂类
class Factory
{
public:
//静态
static Products* create_product(const string& p_name)
{
Products* p = NULL;
if(p_name == "car")
{
p = new car();
}
else if (p_name == "bus")
{
p = new bus();
}

return p;
}
};

#endif

client.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "SimpleFactory.h"
//客户端
int main()
{
Products* pcar = Factory::create_product("car");
pcar->product();

//释放资源
delete pcar;

Products* pbus = Factory::create_product("bus");
pbus->product();

//释放资源
delete pbus;

return 0;
}

在这里插入图片描述


二、使用unique_ptr的优化

SimpleFactory.h

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

#ifndef SIMPLEFACTORY_H
#define SIMPLEFACTORY_H
#include <iostream>
#include <string>
#include <memory>
using namespace std;
//抽象产品类
class Products
{
public:
virtual void product() = 0;
};

//具体产品
class car : public Products
{
public:
virtual void product()
{
cout << "create car" << endl;
}
};

class bus : public Products
{
public:
virtual void product()
{
std::cout << "create bus" << std::endl;
}
};

//工厂类
class Factory
{
public:
//静态
static unique_ptr<Products> create_product(const string& p_name)
{

if(p_name == "car")
{
return unique_ptr<Products>(new car());
}
else if (p_name == "bus")
{
return unique_ptr<Products>(new bus());
}
//没有匹配NULL
return unique_ptr<Products>();
}
};

#endif

client.cpp

1
2
3
4
5
6
7
8
9
10
11
12
#include "SimpleFactory.h"
//客户端
int main()
{
unique_ptr<Products> upcar = Factory::create_product("car");
upcar->product();

unique_ptr<Products> upbus = Factory::create_product("bus");
upbus->product();

return 0;
}

在这里插入图片描述


三、简单工厂模式总结

(1)优点

  1. 实现了对象创建和使用的分离
  2. 客户端仅需知道产品名对应参数即可,无需记忆类名
  3. 客户端可使用配置文件,不修改客户端代码的前提下,提高系统的灵活性

(2)缺点

  1. 工厂类职责过重
  2. 增加类个数,增加系统了系统的复杂程度
  3. 系统扩展困难,一旦增加新产品就必须修改工厂逻辑,当产品过多时就会导致工厂类过于复杂
  4. 简单工厂模式使用了静态工厂方法,造成角色无法形成基于继承的结构。

(3)使用场景

  1. 工厂类创建对象较少
  2. 客户端只关心传入工厂参数,不关心如何创建对象。