本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7614630.html,记录一下学习过程以备后续查用。
一、引言
在现实生活中,我们经常会遇到一些构成比较复杂的物品。比如电脑,是由CPU、主板、内存条、硬盘、显卡、机箱等组装而成的。手机也是复杂物品,由主板、各种芯片、RAM、ROM、摄像头等部件组成。但是无论是电脑还是手机,它们的组装过程是固定的。拿手机来说,组装流水线是固定的、不变的,但是把不同的主板和其它组件组装在一起就会生产出不同型号的手机。那么在软件系统中是不是也会存在这样的对象呢?答案是肯定的。在软件系统中我们也会遇到类似的复杂对象,并且这个复杂对象的各个部分按照一定的算法组合在一起,此时该对象的创建工作就可以使用Builder模式了,下面让我们详细看看这个模式吧。
二、建造者模式介绍
建造者模式(也叫生成器模式):英文名称--Builder Pattern;分类--创建型。
2.1、动机(Motivate)
在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成。由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?
2.2、意图(Intent)
将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。——《设计模式》GoF
2.3、结构图(Structure)
2.4、模式的组成
1)抽象建造者角色(Builder):为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成部分的建造。一般而言,此角色规定要实现复杂对象的哪些部件的创建,并不涉及具体的对象部件的创建。
2)具体建造者(ConcreteBuilder)
I、实现Builder的接口以构造和装配该产品的各个部件,即实现抽象建造者角色Builder的方法。
II、定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各个部分的创建。
III、提供一个检索产品的接口。
IV、构造一个使用Builder接口的对象,即在指导者的调用下创建产品实例。
3)指导者(Director):调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。
4)产品角色(Product):建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。
2.5、建造者模式的具体实现
现在人们生活水平都提高了,家家都有了家庭轿车,那今天我们就以汽车组装为例来说明Builder模式的实现。
class Program { /// <summary> /// 小轿车类 /// </summary> public sealed class SaloonCar { //小轿车部件集合 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 { //创建车门 public abstract void BuildSaloonCarDoor(); //创建车轮 public abstract void BuildSaloonCarWheel(); //创建车引擎 public abstract void BuildSaloonCarEngine(); //获得组装好的小轿车 public abstract SaloonCar GetSaloonCar(); } /// <summary> /// 具体创建者,具体车型的创建者,例如:别克。 /// </summary> public sealed class BuickBuilder : Builder { SaloonCar buickCar = new SaloonCar(); public override void BuildSaloonCarDoor() { buickCar.Add("Buick's door"); } public override void BuildSaloonCarWheel() { buickCar.Add("Buick's wheel"); } public override void BuildSaloonCarEngine() { buickCar.Add("Buick's engine"); } public override SaloonCar GetSaloonCar() { return buickCar; } } /// <summary> /// 具体创建者,具体车型的创建者,例如:奥迪 /// </summary> public sealed class AoDiBuilder : Builder { SaloonCar aoDiCar = new SaloonCar(); public override void BuildSaloonCarDoor() { aoDiCar.Add("Aodi's door"); } public override void BuildSaloonCarWheel() { aoDiCar.Add("Aodi's wheel"); } public override void BuildSaloonCarEngine() { aoDiCar.Add("Aodi's engine"); } public override SaloonCar GetSaloonCar() { return aoDiCar; } } /// <summary> /// 这个类型才是组装的 /// Construct方法里面的实现就是创建复杂对象固定算法的实现,该算法是固定的或者说是相对稳定的。 /// 这个人当然就是老板了,也就是建造者模式中的指挥者。 /// </summary> public class Director { //组装汽车 public void Construct(Builder builder) { builder.BuildSaloonCarDoor(); builder.BuildSaloonCarWheel(); builder.BuildSaloonCarEngine(); } } static void Main(string[] args) { #region 建造者模式 Director director = new Director(); Builder buickBuilder = new BuickBuilder(); Builder aoDiBuilder = new AoDiBuilder(); //组装别克小轿车 director.Construct(buickBuilder); SaloonCar buickCar = buickBuilder.GetSaloonCar(); buickCar.Show(); Console.WriteLine(); //组装奥迪小轿车 director.Construct(aoDiBuilder); SaloonCar aoDiCar = aoDiBuilder.GetSaloonCar(); aoDiCar.Show(); Console.Read(); #endregion } }