设计模式—建造者模式

前言

需要创建一个复杂的对象,这个复杂的对象有其他各部分子对象通过一定的步骤组合而成。例如:电脑是一个复杂的对象,由cpu,主板,硬盘,显卡,机箱组成,如果此时让采购员一台台的去组装是不可能的。建造者模式可以解决这个问题,我们可以吧电脑的各个组件的组成过程封装到一个建造者类对象中,建造者只要负责返还给客户端全部组件都建造完毕的对象就可以了。此时只需要和电脑城的老板说自己要采购什么样的电脑就可以了,老板会吧组装好的电脑送到公司

建造者模式介绍

1)实际例子

电脑城老板和客户(采购员)联系,电脑的组装是由老板指挥机装人员去吧电脑的各个组件装起来,真正负责创建产品的人就是电脑城的机装人员

 

  1 //创造者模式:将一个复杂对象的构造与他的标示分离,使得同样的构造过程可以创建不同的表示
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Text;
  6 
  7 namespace ConsoleApplication1
  8 {
  9     /// <summary>
 10     /// 指挥创建过程类
 11     /// </summary>
 12     public class Director
 13     {
 14         //组装电脑
 15         public void Construct(Builder builder)
 16         {
 17             builder.BuildPartCPU();
 18             builder.BuildPartMainBoard();
 19         }
 20     }
 21 
 22     public class Computer
 23     {
 24         //电脑组件集合
 25         private IList<string> parts = new List<string>();
 26 
 27         //把单个组件添加到电脑组件集合中
 28         public void Add(string part)
 29         {
 30             parts.Add(part);
 31         }
 32 
 33         public void Show()
 34         {
 35             Console.WriteLine("电脑开始组装了");
 36 
 37             foreach (var v in parts)
 38             {
 39                 Console.WriteLine("组件" + v + "已装好");
 40             }
 41             Console.WriteLine("电脑已装好");
 42         }
 43     }
 44 
 45     /// <summary>
 46     /// 抽象建造者
 47     /// </summary>
 48     public abstract class Builder
 49     {
 50         /// <summary>
 51         /// 装cpu
 52         /// </summary>
 53         public abstract void BuildPartCPU();
 54 
 55         /// <summary>
 56         /// 装主板
 57         /// </summary>
 58         public abstract void BuildPartMainBoard();
 59 
 60         /// <summary>
 61         /// /获得组装好的电脑
 62         /// </summary>
 63         public abstract Computer GetComputer();
 64     }
 65 
 66     public class ConcreteBuilder1 : Builder
 67     {
 68         Computer computer = new Computer();
 69         public override void BuildPartCPU()
 70         {
 71             computer.Add("CPU1");
 72         }
 73 
 74         public override void BuildPartMainBoard()
 75         {
 76             computer.Add("Main Board1");
 77         }
 78 
 79         public override Computer GetComputer()
 80         {
 81             return computer;
 82         }
 83     }
 84 
 85     public class ConcreteBuilder2 : Builder
 86     {
 87         Computer computer = new Computer();
 88         public override void BuildPartCPU()
 89         {
 90             computer.Add("CPU2");
 91         }
 92 
 93         public override void BuildPartMainBoard()
 94         {
 95             computer.Add("Main Board2");
 96         }
 97 
 98         public override Computer GetComputer()
 99         {
100             return computer;
101         }
102     }
103 }

 

调用方法:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 
 6 namespace ConsoleApplication1
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             //客户找到老板说要买电脑,要组装两台电脑
13 
14             //创建指挥者和构造者
15             Director director = new Director();
16             Builder b1 = new ConcreteBuilder1();
17             Builder b2 = new ConcreteBuilder2();
18 
19             //老板叫员工去组装第一台电脑
20             director.Construct(b1);
21             //组装完,组装人员办理组装好的电脑
22             Computer computer1 = b1.GetComputer();
23             computer1.Show();
24 
25             //老板叫员工去组装第二台电脑
26             director.Construct(b2);
27             Computer computer2 = b2.GetComputer();
28             computer2.Show();
29         }
30     }
31 }

运行结果:

 

2)建造者模式介绍

建造者模式:将一个复杂的对象的构建与他的表示分离,使得同样的构造过程可以创建不同的表示

建造者模式使得建造蛇代码与表示代码的分离,可以是客户端不必知道产品内部组成的细节,从而降低客户端和具体产品之间耦合度

3)建造者模式分析

在建造者模式中指挥者直接与客户端打交道的,指挥者将客户端的请求划分为对各个组件的建造请求,在将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户指定

建造者模式主要用于‘分步骤来构建一个复杂的过程’,其中步骤是一个固定的组合过程,而复杂对象的各个部分是变化的

产品不需要抽象类,由于建造者模式建造出来的产品可能差异性很大,所以不可能抽象出来一个产品

抽象构成模式解决了‘系列产品’的需求变化,建造者模式解决了‘产品部分’的需求变化

由于建造者模式隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要在事项一个具体的建造者就可以了,从而很好的应对产品租场组件的需求变化

posted @ 2015-11-18 17:29  细数青春  阅读(244)  评论(0编辑  收藏  举报