工厂模式

scorlw 发布于

工厂模式

设计模式

工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。工厂方法模式的意义是
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类
必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

类的角色与职责

  1. 抽象工厂( Creator)角色

    工厂方法模式的核心,任何工厂类都必须实现这个接口。

  2. 具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化产品对象。

  3. 抽象( Product)角色
    方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

  4. 具体产品( Concrete Product)角色
    工厂方法模式所创建的具体实例对象

image-20200928225630456

代码实现

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/***实现一个可以创建水果的工厂***/
#include <iostream>
#include <string.h>

using namespace std;

//共有的父类
class Fruit
{
public:
virtual void getFruit() = 0;
protected:
private:
};

class Banana:public Fruit
{
public:
virtual void getFruit()
{
cout << "get banana!" << endl;
}
protected:
private:
};

class Apple:public Fruit
{
public:
virtual void getFruit()
{
cout << "get apple!" << endl;
}
protected:
private:
};

//抽象工厂
class AbFactory
{
public:
virtual Fruit* creat() = 0;
protected:
private:
};

class BananaFactory:public AbFactory
{
public:
virtual Fruit* creat()
{
return new Banana;
}
protected:
private:
};

class AppleFactory:public AbFactory
{
public:
virtual Fruit* creat()
{
return new Apple;
}
protected:
private:
};

int main()
{
AbFactory *f = NULL;
Fruit *fruit = NULL;

f = new BananaFactory;//根据需求建立对应的工厂
fruit = f->creat();//工厂完成对应货物的构建

fruit->getFruit();
delete fruit;
delete f;
cout << "Hello world!" << endl;
return 0;
}

输出:

1
2
get banana!
Hello world!

与简单工厂的区别

工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽
象工厂类,而简单工厂模式把核心放在一个具体类上。

工厂方法模式之所以有一个别名叫多态性工厂模式,是因为具体工厂类都有共同的接口,
或者有共同的抽象父类。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对
象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放一封闭”
原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模
式退化后可以演变成简单工厂模式。