构建者
- 定义: 构造者模式是在构造比较复杂对象,并且该对象可以拆分多个,每个拆分也是个对象或组成部分
- 举例子:一个产品有不同的组成部分,而在程序里面需要把一个产品抽检出来需要较多的零件进行处理和组装,使得构造一个产品变得非常复杂,构造模式就是使得客户在不需要知道这么多复杂的细节,不必关心产品内部细节。
- 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。
- 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
- 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。
- 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
标准的构造者
- 产品
/**
* 构造产品
*/
public class Product {
private String name;
private String type;
public void showProduct(){
System.out.println("name"+name);
System.out.println("type"+type);
}
public void setName(String name) {
this.name = name;
}
public void setType(String type) {
this.type = type;
}
}
- 构建者,及抽象构建者
/**
* 构建者
*/
public abstract class Builder {
/**
* 通过不是参数设置组件
*/
public abstract void setPart();
/**
* 获取构建成功的product
* @return
*/
public abstract Product getProduct();
}
public class ConcreteBuilder extends Builder {
private Product product=new Product();
public ConcreteBuilder setPartType(String type) {
this.product.setName("name"+type);
return this;
}
public ConcreteBuilder setMax(int max){
this.product.setName("name"+max);
return this;
}
@Override
public void setPart() {
}
@Override
public Product getProduct() {
return product;
}
}
/**
* 导演类
*/
public class Director {
private ConcreteBuilder builder = new ConcreteBuilder();
public Product getAProduct(){
// builder.setPart("宝马汽车","X7");
builder.setPartType("1222").setMax(12221);
return builder.getProduct();
}
public Product getBProduct(){
// builder.setPart("奥迪汽车","Q5");
return builder.getProduct();
}
}
- 调用者
public static void main(String[] args) {
Director dire=new Director();
Product product=dire.getAProduct();
product.showProduct();
}
开源代码解读
- LoadingCache cache= CacheBuilder.newBuilder(); okhttp中都使用了构造者模式。
- 我们来理解消费cache的例子,我们想构建一个复杂的loadingCache的product,loadingCache的生产需要使用不同方法,多个参数来构建。
- 于是我们通过一个构建者来封装具体的构建过程,现在的例子都省略掉了导演类,