• Java设计模式(5)——创建型模式之建造者模式(Builder)


    一、概述

      概念

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。(与工厂类不同的是它用于创建复合对象)

      UML图

       

       主要角色

      抽象建造者(Builder)——规范建造方法与结果返还方法

      具体建造者(Concrter Builder)——实现抽象建造接口,给出具体建造并返还具体结果

      指导者(Director)——调用建造者,与客户端对接

      产品(Product)——具体产品

    二、实践

      很多时候,一些建造的过程是需要有顺序建造的,一个产品的零件组装也有先后之分(以上一节工厂中的为例,内存和处理器可能会需要一个顺序,比如先处理器后内存)。这个时候就需要使用建造者模式了。建造者模式也是为了之前一直提到的解耦——将构建的复杂过程剥离开。

      按照上面的角色划分使用Java来表示:

      抽象建造者

    /**
     * 抽象建造者
     * 作者: Administrator
     * 日期: 2017/10/27
     **/
    public interface Builder {
    
        void buildPart1();
        void buildPart2();
    
        /**
         * 将以上的部件组装,返回组装后的产品
         * @return
         */
        Product retrieveResult();
    }

      具体建造者

    /**
     * 具体创建者
     * 作者: Administrator
     * 日期: 2017/10/27
     **/
    public class ConcreteBuilder implements Builder{
        Part part1,part2;
    
        @Override
        public void buildPart1() {
            // 构建部件1
        }
    
        @Override
        public void buildPart2() {
            // 构建部件2
        }
    
        @Override
        public Product retrieveResult() {
            // 返回组装后的成品
            return null;
        }
    }

      指导者(导演)

    /**
     * 指导者(导演)
     * 作者: Administrator
     * 日期: 2017/10/27
     **/
    public class Director {
        private Builder builder;
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        public void construct() {
            builder.buildPart1();
            builder.buildPart2();
        }
    }

      产品与部件

    /**
     * 产品
     * 作者: Administrator
     * 日期: 2017/10/27
     **/
    public interface Product {
    }
    /**
     * 产品部件
     * 作者: Administrator
     * 日期: 2017/10/27
     **/
    public interface Part {
    }

      客户端使用——通过指导者来指导建造,具体建造者返回对象

        客户端只需要建造者和指导者即可得到产品!

        只要给出导演(包工头),和具体建造者(工人),我就可以按照盖楼先从地基打起再做一楼、二楼的顺序盖一座大楼!(注意细节的关注)

    public static void main(String[] args) {
            ConcreteBuilder builder = new ConcreteBuilder();
            Director director = new Director(builder);
    
            director.construct();
            Product product = builder.retrieveResult();
        }

     三、改进与思考

      多个产品的拓展

      

       适用性的思考

      这里直接引用《Java与模式》之中的讲述

      

       与工厂模式的区别

      引用自CSDN论坛:

      工厂方法方法应该算是一种思想,即对于一个易变的、目前不确定的东西做个接口,留给以后实现,这样可以达到某种程度的解耦。
    抽象工厂也有接口,但它倒不是出于难以确定的目的,而是因为复杂而封装为接口供使用。举个例子来说,桌子由桌面和桌脚两部分组成,
    桌面有圆形和方形两种,桌脚有三脚和四脚两种,我们可以封装出一个叫“书桌”的东西供客户使用,只要是说到“书桌”就是指四脚的方桌。   建造者也是一种封装,只是它封装的是过程。举例来说,钢材可以生产出棒材和钢管两种产品,这两种产品开始总要经过轧机,
    最后总要冷却,它们中间也可能有相同的工艺,但我们还是分别把它们封装为棒材流水线和钢管流水线,而不是通过“到某某环节时用某某工艺
    ”来控制它们的生产流程。   抽象工厂和建造者都是对复杂东西的封装,使得用户看起来或使用起来简单,只是一个封装的是结构性的东西,
    另一个封装的是过程性的东西。这都是oo的封装和接口的思想的运用。   设计模式这个东西就像张无忌学的太极拳,招式只是为了领会精要,一旦领会,就要把具体的招式忘掉。不要拘泥于设计模式的具体形式。

       再看《Java与模式》中的阐述:

      抽象工厂简略图:

      

      建造者模式简略图见文首

      区别:

      

      

       (类似于生产内存和处理器 VS 生产手机的例子,内存和处理器可以再组合)

  • 相关阅读:
    react中的生命周期钩子
    vue小知识
    vue发布中的前后端分离和前后端不分离
    vue中的vuex
    vue项目的发布
    stylus解决移动端1像素
    一行代码实现数组去重(ES6)
    详解js中Number()、parseInt()和parseFloat()的区别_javascript技巧
    关于element-ui 的日期时间选择器的超出时间无法选择的设置
    git使用
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7742079.html
Copyright © 2020-2023  润新知