建造者模式
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度,下面通过类图来帮助大家更好地理清建造者模式中类之间的关系。
建造模式的实现要点:
- 在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
- 建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的(也就是说电脑的内部组件是经常变化的,这里指的的变化如硬盘的大小变了,CPU由单核变双核等)。
- 产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
- 在前面文章中介绍的抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
- 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。
在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成。例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU、主板、硬盘、显卡、机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了。然而现实生活中也是如此的,如果公司要采购一批电脑,此时采购员不可能自己去买各个组件并把它们组织起来,此时采购员只需要像电脑城的老板说自己要采购什么样的电脑就可以了,电脑城老板自然会把组装好的电脑送到公司。下面就以这个例子来展开建造者模式的介绍。
1 /// 建筑模式中的指挥者,这里是电脑城的老板。 2 /// </summary> 3 public class Director 4 { 5 public void Construct(Builder builder) 6 { 7 builder.BuilderCPU(); 8 builder.BuilderBoard(); 9 } 10 } 11 12 /// <summary> 13 /// 抽象的建造者,这里是组装人。 14 /// </summary> 15 public abstract class Builder 16 { 17 //组装CPU 18 public abstract void BuilderCPU(); 19 20 //组装主板 21 public abstract void BuilderBoard(); 22 23 //获得装好的电脑 24 public abstract Computer GetComputer(); 25 } 26 27 /// <summary> 28 /// 电脑类 29 /// </summary> 30 public class Computer 31 { 32 //电脑组建集合 33 private List<string> parts = new List<string>(); 34 35 public void Add(string part) 36 { 37 parts.Add(part); 38 } 39 40 public void Show() 41 { 42 foreach (string part in parts) 43 { 44 Console.WriteLine("组建:【" + part + "】已经组装好"); 45 } 46 Console.WriteLine("电脑已经组装好了"); 47 } 48 49 } 50 51 /// <summary> 52 /// 具体的建造者1,这里是具体负责组装电脑的第一个人。 53 /// </summary> 54 public class ConcreteBuilder1 : Builder 55 { 56 Computer computer = new Computer(); 57 58 public override void BuilderCPU() 59 { 60 computer.Add("I5"); 61 } 62 63 public override void BuilderBoard() 64 { 65 computer.Add("华硕Z170"); 66 } 67 68 public override Computer GetComputer() 69 { 70 return computer; 71 } 72 } 73 74 /// <summary> 75 /// 具体建造者2,这里是具体负责组装电脑的第二个人。 76 /// </summary> 77 public class ConcreteBuilder2 : Builder 78 { 79 Computer computer = new Computer(); 80 81 public override void BuilderCPU() 82 { 83 computer.Add("I7"); 84 } 85 86 public override void BuilderBoard() 87 { 88 computer.Add("Z270"); 89 } 90 91 public override Computer GetComputer() 92 { 93 return computer; 94 } 95 96 }
客户端:
1 Console.WriteLine("【建筑者模式】"); 2 Console.WriteLine(); 3 4 //构建指挥者,客户给电脑城老板提需求 5 Director director = new Director(); 6 //构建建筑者,创建组装人员 7 ConcreteBuilder1 builder1 = new ConcreteBuilder1(); 8 ConcreteBuilder2 builder2 = new ConcreteBuilder2(); 9 10 //指挥者让建筑者开始干活 11 director.Construct(builder1); 12 //组装完,建筑者搬来电脑 13 Computer computer1 = builder1.GetComputer(); 14 computer1.Show(); 15 Console.WriteLine(); 16 17 18 //指挥者叫第二个建筑者去装个跟高配的电脑 19 director.Construct(builder2); 20 Computer computer2 = builder2.GetComputer(); 21 computer2.Show(); 22 23 Console.ReadLine();
くろさきいちご