设计模式之建造者模式(三)

设计模式之建造者模式(三)

  今天来学习建造者模式,好像也有人叫生成器,一个意思.

  一  概念

  建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

  二  介绍

  意图:一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

  主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

  何时使用:一些基本部件不会变,而其组合经常变化的时候。

  如何解决:将变与不变分离开。

  关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

  应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

  优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

  缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

  使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

  注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

  三  图解

  三  生活实例

  下面我来举一个生活中的例子:

  说到建造者模式,我想买电脑这个例子是比较贴切的.

  假如你想买一些电脑配件自己来组装,电脑有很多配件,比如CPU,主板,机箱等等......但是你又不懂电脑的配件和组装,这时你来找我,因为你觉得我是个程序员,我比较懂,,,我确实比你懂,但是,我又比较懒,于是呢.我就给出了一个规范,找一个跑腿的按照这个规范去帮我买和组装...有点乱,没关系,再来捋一下,你就相当于导演这个角色(director),我就是你找来的抽象建造者(Builder),跑腿的就是具体的建造者(ConcreteBuilder),电脑就是最终要构建的产品

  上边的图是copy别人的,捋清这个关系就行,下边我要写的代码的方法名可能和图片上不一样,不过没关系,看代码就能看懂

  那再来提供一张图吧

 

  四  代码展示

 /// <summary>
    /// 主程序
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Builder builder = new ConcreBuilder();
            Director director = new Director(builder);
            Computer computer = director.CreateComputer();
            Console.WriteLine("电脑创建好了");
            Console.WriteLine(computer.ToString());
            Console.ReadKey();
        }
    }
========================
 /// <summary>
    /// 导演者
    /// </summary>
    class Director
    {
        Builder builder;
        public Director(Builder b) {
            this.builder = b;
        }
        public Computer CreateComputer() {
            builder.BuildPart();
            return builder.GetComputer();
        }
    }
========================
/// <summary>
    /// 抽象建造者
    /// </summary>
    interface Builder
    {
        //创建产品的方法
        void BuildPart();
        //拿到创建的产品
        Computer GetComputer();
    }
========================
/// <summary>
    /// 具体建造者
    /// </summary>
    class ConcreBuilder : Builder
    {
        Computer computer = new Computer();
        public void BuildPart()
        {
            computer.BuildCpu();
            computer.BuildJiXiang();
            computer.BuildZhuBan();
        }

        public Computer GetComputer()
        {
            return computer;
        }
    }
========================
/// <summary>
    /// 电脑产品
    /// </summary>
    class Computer
    {
        public string CPU { get; set; }
        public string ZhuBan { get; set; }
        public string JiXiang { get; set; }

        public void BuildCpu() {
            Console.WriteLine("正在创建CPU......");
            this.CPU = "intel core i7";
            Console.WriteLine("CPU创建完成......");
        }
        public void BuildZhuBan()
        {
            Console.WriteLine("正在创建主板......");
            this.ZhuBan = "华硕主板";
            Console.WriteLine("主板创建完成......");
        }
        public void BuildJiXiang()
        {
            Console.WriteLine("正在创建机箱......");
            this.JiXiang = "手工定制机箱";
            Console.WriteLine("机箱创建完成......");
        }
        public override string ToString()
        {
            return "展示一下电脑配置:  "+this.CPU+"  "+this.ZhuBan+ "  " + this.JiXiang;
        }
       
    }
View Code

代码已经给大家准备好了,是不是很贴心呢.

 这是程序的运行结果

 

温馨小提示:.net中的stringbuilder 就是使用的建造者模式

posted @ 2018-06-02 13:22  zkh-balance  阅读(114)  评论(0编辑  收藏  举报