0%

设计模式之原型模式和构建器模式

设计模式基础(7):原型模式&构建器模式

包含原型模式&构建器模式两种模式中的C++示例代码、面向的问题、图解两种模式核心思想

原型模式

面向的需求

其应用场景也是为了避免new和主体部分紧耦合。主要是为了优化new一个新对象时太过于复杂,而利用拷贝构造技术进行效率优化的一种方案。

示例代码

1
2
3
4
5
6
7
8
9
//抽象类
class ISplitter{
public:
virtual void split()=0;
virtual ISplitter* clone()=0; //通过克隆自己来创建对象

virtual ~ISplitter(){}

};
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
//具体类
class BinarySplitter : public ISplitter{
public:
virtual ISplitter* clone(){
return new BinarySplitter(*this);
}
};

class TxtSplitter: public ISplitter{
public:
virtual ISplitter* clone(){
return new TxtSplitter(*this);
}
};

class PictureSplitter: public ISplitter{
public:
virtual ISplitter* clone(){
return new PictureSplitter(*this);
}
};

class VideoSplitter: public ISplitter{
public:
virtual ISplitter* clone(){
return new VideoSplitter(*this);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class MainForm : public Form
{
ISplitter* prototype;//原型对象

public:

MainForm(ISplitter* prototype){
this->prototype=prototype;
}

void Button1_Click(){
ISplitter * splitter=
prototype->clone(); //克隆原型

splitter->split();
}
};

代码思想分析

对比工厂方法和原型模式。理解原型模式的意图。

原型模式

关键点

  • 主要思想还是保持主体部分的稳定,只是具体实现上,原型模式更适用于初始化复杂的对象类型。

构建器模式

面向的需求

在具体的类中,发现业务逻辑过于繁杂。可通过分析其变化与稳定部分,拆分为多个类进行构建。

示例代码

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
class House{
//....
};

class HouseBuilder {
public:
House* GetResult(){
return pHouse;
}
virtual ~HouseBuilder(){}
protected:

House* pHouse;
virtual void BuildPart1()=0;
virtual void BuildPart2()=0;
virtual void BuildPart3()=0;
virtual void BuildPart4()=0;
virtual void BuildPart5()=0;

};

class StoneHouse: public House{

};

class StoneHouseBuilder: public HouseBuilder{
protected:

virtual void BuildPart1(){
//pHouse->Part1 = ...;
}
virtual void BuildPart2(){

}
virtual void BuildPart3(){

}
virtual void BuildPart4(){

}
virtual void BuildPart5(){

}

};

class HouseDirector{

public:
HouseBuilder* pHouseBuilder;

HouseDirector(HouseBuilder* pHouseBuilder){
this->pHouseBuilder=pHouseBuilder;
}

House* Construct(){

pHouseBuilder->BuildPart1();

for (int i = 0; i < 4; i++){
pHouseBuilder->BuildPart2();
}

bool flag=pHouseBuilder->BuildPart3();

if(flag){
pHouseBuilder->BuildPart4();
}

pHouseBuilder->BuildPart5();

return pHouseBuilder->GetResult();
}
};

代码思想分析

构建器模式

关键点

  • 其主要面对的就是分步骤构建一个复杂的对象。要注意到“分步骤”是一个稳定的算法。而各个部分则经常变化。
  • 将变化点进行封装,应对频繁的需求变动。