设计模式相关面试问题-Builder基础详解与代码解读

java的builder模式详解:

  • 概念:
    建造者模式是较为复杂的创建型模式,它将客户端与多含多个组成部分(或部件)的复杂对象的创建过程分离。
  • 使用场景:
    当构造一个对象需要很多参数的时候,并且参数的个数或者类型不固定的时候。
  • UML结构图分析:

    下面具体介绍一下角色:
    Builder:它为创建一个产品Product对象的各个部件指定抽象接口。
    ConcreteBuilder:它实现了Builder接口,实现各个部件的具体构造和装配方法。
    Product:它是被构建的复杂对象,包含多个组成部件。
    Director:指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系。
  • 实际代码分析:
    先新建Product类:
    public class Product {
        /* 定义部件,部件可以是任意类型,包括值类型和引用类型 */
        private String partA;
        private String partB;
        private String partC;
    
        public String getPartA() {
            return partA;
        }
    
        public void setPartA(String partA) {
            this.partA = partA;
        }
    
        public String getPartB() {
            return partB;
        }
    
        public void setPartB(String partB) {
            this.partB = partB;
        }
    
        public String getPartC() {
            return partC;
        }
    
        public void setPartC(String partC) {
            this.partC = partC;
        }
    
        @Override
        public String toString() {
            return "Product{" +
                    "partA='" + partA + '\'' +
                    ", partB='" + partB + '\'' +
                    ", partC='" + partC + '\'' +
                    '}';
        }
    }

    然后再定义抽像的Builder类:

    abstract class Builder {
        //创建产品对象
        protected Product product = new Product();
    
        public Product getResult() {
            return product;
        }
    
        protected abstract void buildPartA();
    
        protected abstract void buildPartB();
    
        protected abstract void buildPartC();
    }

    再定义具体的Builder类:

    /**
     * 具体构建者
     */
    public class ConcreteBuilder extends Builder {
        @Override
        protected void buildPartA() {
            product.setPartA("aaaa");
        }
    
        @Override
        protected void buildPartB() {
            product.setPartB("bbbb");
        }
    
        @Override
        protected void buildPartC() {
            product.setPartC("cccc");
        }
    }

    最后新建Director供客户端调用的指挥类:

    /**
     * 建造指挥者
     */
    public class Director {
    
        private Builder builder;
    
        public void setBuilder(Builder builder) {
            this.builder = builder;
        }
    
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        //产品构建与组装方法
        public Product construct() {
            builder.buildPartA();
            builder.buildPartB();
            builder.buildPartC();
            return builder.getResult();
        }
    }

    然后客户端去使用一下:

    而如果修改构造细节:

    其结果也会变化:

    这里需要注意:在实际使用建造者模式时,可能只会用到ConcreteBuilder对像来构建,而不会完全按照UML类的结构来。

  • Builder模式优点:
    1、松散耦合:生成器模式可以用同一个构建算法构建出表现上完全不同的产品,实现产品构建与产品表现上的分离。
    2、可以很容易的改变产品的内部表示。
    3、更好的复用性:生成器模式很好的实现构建算法和具体产品实现的分离。
  • Builder模式缺点:
    会产生多余的Builder对象以及Director对象,消耗内存。

builder模式在android中的实际运用:

AlertDialog就是典型应用Builder模式的最好代表,下面来从代码角度来分析一下:

其中AlertController肯定是控制相关业务的,先来看一下它是在哪初始化的,很显然从构造方法中去找寻:

发现在是最后一个构造方法中去初始化的,具体如下:

接着来看一下AlertDialog.onCreate()方法:

此时看一下具体实现:

先不看具体细节,从这个调用层次来看真正实现业务逻辑的就是AlerController,接下来回到AlerDialog的Builder内部类:

然后在这个Builder类中有个onCreate()方法,如下:

接下来看一下这个apply的执行细节:

最后再来看一下AlertController.installContent()的细节:

调用的是父类的方法:

接着再来看一下这个方法:

posted on 2018-05-04 16:16  cexo  阅读(194)  评论(0编辑  收藏  举报

导航