设计模式相关面试问题-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()的细节:
调用的是父类的方法:
接着再来看一下这个方法: