您的位置:首页 > 其它

设计模式之建造者模式

2014-08-12 17:39 169 查看
建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP)。

《大话设计模式》举了一个很好的例子——建造小人,一共需建造6个部分,头部、身体、左右手、左右脚。与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的。建造小人就是在控制下一步步构造出来的。创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构。下面给出建造者模式的UML图,以建造小人为实例。



对于客户来说,只需知道导向者就可以了,通过导向者,客户就能构造复杂的对象,而不需要知道具体的构造过程。

在DP这本书中给出了更抽象化的一个图像



其中的参与者有:

Builder

----为创建一个Product对象的各个部件指定抽象接口。

ConcreteBuilder

----实现Builder的接口以构造和装配该产品的各个部件。

----定义并明确它所创建的表示

----提供一个检索产品的接口

Director

----构造一个使用Builder接口的对象。

Product

----表示被构造的复杂对象

----包含定义组成部件的类

实现的C++代码如下:

C++ Code
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

83

84

85

86

87

88

89

90

91

92

93

94

95

96

class Builder

{

public:

virtual void BuildHead() {}

virtual void BuildBody() {}

virtual void BuildLeftArm() {}

virtual void BuildRightArm() {}

virtual void BuildLeftLeg() {}

virtual void BuildRightLeg() {}

};

//构造瘦人

class ThinBuilder : public Builder

{

public:

void BuildHead()

{

cout << "build thin body" << endl;

}

void BuildBody()

{

cout << "build thin head" << endl;

}

void BuildLeftArm()

{

cout << "build thin leftarm" << endl;

}

void BuildRightArm()

{

cout << "build thin rightarm" << endl;

}

void BuildLeftLeg()

{

cout << "build thin leftleg" << endl;

}

void BuildRightLeg()

{

cout << "build thin rightleg" << endl;

}

};

//构造胖人

class FatBuilder : public Builder

{

public:

void BuildHead()

{

cout << "build fat body" << endl;

}

void BuildBody()

{

cout << "build fat head" << endl;

}

void BuildLeftArm()

{

cout << "build fat leftarm" << endl;

}

void BuildRightArm()

{

cout << "build fat rightarm" << endl;

}

void BuildLeftLeg()

{

cout << "build fat leftleg" << endl;

}

void BuildRightLeg()

{

cout << "build fat rightleg" << endl;

}

};

//构造的指挥官

class Director

{

private:

Builder *m_pBuilder;

public:

Director(Builder *builder)

{

m_pBuilder = builder;

}

void Create()

{

m_pBuilder->BuildHead();

m_pBuilder->BuildBody();

m_pBuilder->BuildLeftArm();

m_pBuilder->BuildRightArm();

m_pBuilder->BuildLeftLeg();

m_pBuilder->BuildRightLeg();

}

};

int main()

{

FatBuilder thin;

Director director(&thin);

director.Create();

return 0;

}
运行结果如下所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: