zoukankan      html  css  js  c++  java
  • C#设计模式——建造者模式

    一、建造者模式介绍:

    建造者模式(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. 由于建造者隐藏了具体产品的组装过程,所以要改变一个产品的内部表示,只需要再实现一个具体的建造者就可以了,从而能很好地应对产品组成组件的需求变化。
  • 相关阅读:
    Xcode4.2 本地化 总结
    Android中后台线程如何与UI线程交互
    Android中后台线程如何与UI线程交互
    如何解决iOS内存错误
    如何解决iOS内存错误
    genymotion 和genymotion eclipse 插件安装 !
    genymotion 和genymotion eclipse 插件安装 !
    CoderForces 518C Anya and Smartphone (模拟)
    CodeForces 518B Tanya and Postcard (题意,水题)
    CodeForces 513A Game (水题,博弈)
  • 原文地址:https://www.cnblogs.com/jiechou/p/9073704.html
Copyright © 2011-2022 走看看