C#设计模式(5)——建造者模式(Builder Pattern)

来源:互联网 发布:java agent 哨兵 编辑:程序博客网 时间:2024/05/17 03:17

一、引言

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。然而现实生活中也是如此的,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。下面就以这个例子来展开建造者模式的介绍。

二、建造者模式的详细介绍

2.1 建筑者模式的具体实现

在这个例子中,电脑城的老板是直接与客户(也就是指采购员)联系的,然而电脑的组装是由老板指挥装机人员去把电脑的各个部件组装起来,真真负责创建产品(这里产品指的就是电脑)的人就是电脑城的装机人员。理清了这个逻辑过程之后,下面就具体看下如何用代码来表示这种现实生活中的逻辑过程:

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

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

  

  

/// <summary>

/// 以组装电脑为例子

/// 每台电脑的组成过程都是一致的,但是使用同样的构建过程可以创建不同的表示(即可以组装成不一样的电脑,配置不一样)

/// 组装电脑的这个场景就可以应用建造者模式来设计

/// </summary>

namespace设计模式之建造者模式

{

    /// <summary>

    /// 客户类

    /// </summary>

    classCustomer

    {

        staticvoid Main(string[] args)

        {

            // 客户找到电脑城老板说要买电脑,这里要装两台电脑

            // 创建指挥者和构造者

            Director director =new Director();

            Builder b1 =new ConcreteBuilder1();

            Builder b2 =new ConcreteBuilder2();

  

            // 老板叫员工去组装第一台电脑

            director.Construct(b1);

  

            // 组装完,组装人员搬来组装好的电脑

            Computer computer1 = b1.GetComputer();

            computer1.Show();

  

            // 老板叫员工去组装第二台电脑

            director.Construct(b2);

            Computer computer2 = b2.GetComputer();

            computer2.Show();

  

            Console.Read();

        }

    }

  

    /// <summary>

    /// 小王和小李难道会自愿地去组装嘛,谁不想休息的,这必须有一个人叫他们去组装才会去的

    /// 这个人当然就是老板了,也就是建造者模式中的指挥者

    /// 指挥创建过程类

    /// </summary>

    publicclass Director

    {

        // 组装电脑

        publicvoid Construct(Builder builder)

        {

            builder.BuildPartCPU();

            builder.BuildPartMainBoard();

        }

    }

  

    /// <summary>

    /// 电脑类

    /// </summary>

    publicclass Computer

    {

        // 电脑组件集合

        privateIList<string> parts =new List<string>();

  

        // 把单个组件添加到电脑组件集合中

        publicvoid Add(stringpart)

        {

            parts.Add(part);

        }

  

        publicvoid Show()

        {

            Console.WriteLine("电脑开始在组装.......");

            foreach(string part in parts)

            {

                Console.WriteLine("组件"+part+"已装好");

            }

  

            Console.WriteLine("电脑组装好了");

        }

    }

  

    /// <summary>

    /// 抽象建造者,这个场景下为 "组装人" ,这里也可以定义为接口

    /// </summary>

    publicabstract classBuilder

    {

        // 装CPU

        publicabstract voidBuildPartCPU();

        // 装主板

        publicabstract voidBuildPartMainBoard();

          

        // 当然还有装硬盘,电源等组件,这里省略

  

        // 获得组装好的电脑

        publicabstract Computer GetComputer();

    }

  

    /// <summary>

    /// 具体创建者,具体的某个人为具体创建者,例如:装机小王啊

    /// </summary>

    publicclass ConcreteBuilder1 : Builder

    {

        Computer computer =new Computer();

        publicoverride voidBuildPartCPU()

        {

            computer.Add("CPU1");

        }

  

        publicoverride voidBuildPartMainBoard()

        {

            computer.Add("Main board1");

        }

  

        publicoverride Computer GetComputer()

        {

            returncomputer;

        }

    }

  

    /// <summary>

    /// 具体创建者,具体的某个人为具体创建者,例如:装机小李啊

    /// 又装另一台电脑了

    /// </summary>

    publicclass ConcreteBuilder2 : Builder

    {

        Computer computer =new Computer();

        publicoverride voidBuildPartCPU()

        {

            computer.Add("CPU2");

        }

  

        publicoverride voidBuildPartMainBoard()

        {

            computer.Add("Main board2");

        }

  

        publicoverride Computer GetComputer()

        {

            returncomputer;

        }

    }

0 0