相关文章:
一、Java的构建者(Builder)模式详解
1、概念
建造者模式是一种较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离。
2、使用场景
当构造一个对象需要很多参数的时候,并且参数的个数或者类型不固定的时候。
例如:AlertDialog、Glide、Okhttp、Retrofit
3、UML结构图
4、实际代码分析
/**
* Builder(抽象建造者):创建产品的抽象接口,一般至少有一个创建产品的抽象方法和一个返回产品的抽象方法。
* 引入抽象类,是为了更容易扩展。
*/
abstract class Builder {
//创建产品对象
protected Product product = new Product();
public abstract void buildPartA();
public abstract void buildPartB();
public abstract void buildPartC();
//返回产品对象
public Product getResult() {
return product;
}
}
/**
* 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;
}
}
/**
* ConcreteBuilder(实际的建造者):继承Builder类,实现抽象类的所有抽象方法。实现具体的建造过程和细节。
*/
public class ConcreteBuilder extends Builder {
@Override
public void buildPartA() {
}
@Override
public void buildPartB() {
}
@Override
public void buildPartC() {
}
}
/**
* Director(指挥者类):分配不同的建造者来创建产品,统一组装流程。
*/
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public void setBuilder(Builder builder) {
this.builder = builder;
}
//产品构建与组装方法
public Product construct(){
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
return builder.getResult();
}
}
public class BuilderClient {
public static void main(String[] args) {
//可通过配置文件实现
Builder builder = new ConcreteBuilder();
Director director = new Director(builder);
Product product = director.construct();
}
}
5、Builder模式优点
a、松散耦合:构建者模式可以用同一个构建算法构建出表现上完全不同的产品,
实现产品构建和产品表现上的分离
b、可以很容易的改变产品的内部表示
c、更好的复用性:构建者模式可以很好的实现构建算法和具体产品实现的分离
6、Builder模式缺点
a、会产生多余的Builder对象以及Director对象,消耗内存
b、对象的构建过程暴露
二、构建者(Builder)模式在Android中的实际使用
1、AlertDialog
2、Glide/Okhttp