一、建造者模式介绍:
建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,使得建造代码与表示代码的分离,可以使客户端不必知道产品内部组成的细节,从而降低了客户端与具体产品之间的耦合度。建造者模式的本质是使组装过程和创建具体产品解耦。
二、情景例子:
还是以笔记本为例子,电脑店想进一批笔记本,采购员去到笔记本工厂里取货,笔记本具有很多配件例如CPU、内存、主板、电源等等,不可能是让采购员去到自己一个一个配件去装,工厂都是事先让工人们装好了一批又一批笔记本。这里就能够用到建造者模式去实现,将笔记本的每个配件的组装封装到一个建造者类中,建造者只需返回建造完成的产品对象就可以了。
三、相关代码:
1、创建产品类,包含产品配件的集合:
/// <summary> /// 产品(笔记本)类 /// </summary> public class NoteBook { //笔记本组件集合 private IList<string> parts = new List<string>(); //把单个组件添加到笔记本组件集合中 public void Add(string part) { parts.Add(part); } //展示安装过程 public void Show() { Console.WriteLine("笔记本正在组装...."); foreach (var item in parts) { Console.WriteLine("组件"+item+"已装好!"); } Console.WriteLine("笔记本组装完毕!"); } }
2、创建建造者抽象父类,因为笔记本配件的安装过程是一致的:
/// <summary> /// 建造者抽象父类 /// </summary> public abstract class Builder { //装CPU public abstract void BuildPartCPU(); //装内存 public abstract void BuildPartMemory(); //获得组装好的笔记本 public abstract NoteBook GetNoteBook(); }
3、创建建造者模式中的指挥者,指挥具体建造者组装笔记本:
/// <summary> /// 指挥者类 /// </summary> public class Commander { //组装笔记本 public void Construct(Builder builder) { builder.BuildPartCPU(); builder.BuildPartMemory(); } }
4、创建具体建造者,重写抽象组装过程方法,区别只在于其组装的配件不同:
/// <summary> /// 具体建造者类 /// </summary> public class Worker1 : Builder { NoteBook notebook = new NoteBook(); public override void BuildPartCPU() { notebook.Add("i5-CPU"); } public override void BuildPartMemory() { notebook.Add("4G-KingSton"); } public override NoteBook GetNoteBook() { return notebook; } }
/// <summary> /// 具体制造者类 /// </summary> public class Worker2 : Builder { NoteBook notebook = new NoteBook(); public override void BuildPartCPU() { notebook.Add("i7-CPU"); } public override void BuildPartMemory() { notebook.Add("8G-KingSton"); } public override NoteBook GetNoteBook() { return notebook; } }
5、调用
Commander commander = new Commander(); //工人小明 Builder xiaoming = new Worker1(); //指挥者叫小明去组装笔记本 commander.Construct(xiaoming); //小明装好了笔记本 NoteBook notebook1 = xiaoming.GetNoteBook(); notebook1.Show(); //工人小红 Builder xiaohong = new Worker2(); //指挥者叫小红去组装笔记本 commander.Construct(xiaohong); //小红装好了笔记本 NoteBook notebook2 = xiaohong.GetNoteBook(); notebook2.Show(); Console.ReadKey();
四、总结:
建造模式的实现要点:
- 在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
- 建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的,也就是说笔记本的内部组件是经常变化的,如硬盘、CPU的产品性能等。
- 产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
- 抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
- 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。