一、建造者模式介绍:

建造者模式(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();

四、总结:

建造模式的实现要点:

  1. 在建造者模式中,指挥者是直接与客户端打交道的,指挥者将客户端创建产品的请求划分为对各个部件的建造请求,再将这些请求委派到具体建造者角色,具体建造者角色是完成具体产品的构建工作的,却不为客户所知道。
  2. 建造者模式主要用于“分步骤来构建一个复杂的对象”,其中“分步骤”是一个固定的组合过程,而复杂对象的各个部分是经常变化的,也就是说笔记本的内部组件是经常变化的,如硬盘、CPU的产品性能等。
  3. 产品不需要抽象类,由于建造模式的创建出来的最终产品可能差异很大,所以不大可能提炼出一个抽象产品类。
  4. 抽象工厂模式解决了“系列产品”的需求变化,而建造者模式解决的是 “产品部分” 的需要变化。
  5. 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。