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

本文通过实例介绍了构建者模式的概念及其在组装电脑场景中的应用,详细阐述了客户、指挥者、构建者角色的职责,以及如何通过代码实现这一模式。通过将组装过程分解为多个构建步骤,使得电脑的组装过程更加模块化和易于管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引言

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由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>

    class Customer

    {

        static void 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>

    public class Director

    {

        // 组装电脑

        public void Construct(Builder builder)

        {

            builder.BuildPartCPU();

            builder.BuildPartMainBoard();

        }

    }

  

    /// <summary>

    /// 电脑类

    /// </summary>

    public class Computer

    {

        // 电脑组件集合

        private IList<string> parts = new List<string>();

  

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

        public void Add(string part)

        {

            parts.Add(part);

        }

  

        public void Show()

        {

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

            foreach (string part in parts)

            {

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

            }

  

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

        }

    }

  

    /// <summary>

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

    /// </summary>

    public abstract class Builder

    {

        // 装CPU

        public abstract void BuildPartCPU();

        // 装主板

        public abstract void BuildPartMainBoard();

          

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

  

        // 获得组装好的电脑

        public abstract Computer GetComputer();

    }

  

    /// <summary>

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

    /// </summary>

    public class ConcreteBuilder1 : Builder

    {

        Computer computer = new Computer();

        public override void BuildPartCPU()

        {

            computer.Add("CPU1");

        }

  

        public override void BuildPartMainBoard()

        {

            computer.Add("Main board1");

        }

  

        public override Computer GetComputer()

        {

            return computer;

        }

    }

  

    /// <summary>

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

    /// 又装另一台电脑了

    /// </summary>

    public class ConcreteBuilder2 : Builder

    {

        Computer computer = new Computer();

        public override void BuildPartCPU()

        {

            computer.Add("CPU2");

        }

  

        public override void BuildPartMainBoard()

        {

            computer.Add("Main board2");

        }

  

        public override Computer GetComputer()

        {

            return computer;

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值