设计模式—建造者模式
前言
需要创建一个复杂的对象,这个复杂的对象有其他各部分子对象通过一定的步骤组合而成。例如:电脑是一个复杂的对象,由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)建造者模式分析
在建造者模式中指挥者直接与客户端打交道的,指挥者将客户端的请求划分为对各个组件的建造请求,在将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户指定
建造者模式主要用于‘分步骤来构建一个复杂的过程’,其中步骤是一个固定的组合过程,而复杂对象的各个部分是变化的
产品不需要抽象类,由于建造者模式建造出来的产品可能差异性很大,所以不可能抽象出来一个产品
抽象构成模式解决了‘系列产品’的需求变化,建造者模式解决了‘产品部分’的需求变化
由于建造者模式隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要在事项一个具体的建造者就可以了,从而很好的应对产品租场组件的需求变化