zoukankan      html  css  js  c++  java
  • 设计模式之建造者模式(三)

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

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

      一  概念

      建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 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 就是使用的建造者模式

  • 相关阅读:
    [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
    mysqlsla slow-query常用用法
    [POI2000]病毒
    mysqlsla安装
    mysqldumpslow
    [学习笔记]约数
    查看MySQL数据的连接
    [学习笔记]质数
    关于ulimit -a中需要修改的两个值
    Miller-Rabin与二次探测
  • 原文地址:https://www.cnblogs.com/zkhbalance/p/9125170.html
Copyright © 2011-2022 走看看