建造者模式,2021 最新网易 Android 面经
public static void main(String[] args) {
//创建构造者
Builder builder = new ConcreteBuilder();
//构造者设置/构造产品的不同部分
builder.setPart1("param1");
builder.setPart2("param2");
builder.setPart3("param3");
//构造者返回一个产品对象
Product product = builder.buildProduct();
//使用产品对象
System.out.println(product.getPart1());
System.out.println(product.getPart2());
System.out.println(product.getPart3());
}
}
在上面的代码中,ConcreteBuilder 的内部是首先创建好了一个 Product 对象,然后外部调用的时候会将各部分的参数设置给 product 对象,但是有时我们的 Product 构造函数是有必传参数的,就是必须传递参数才能构造产品对象,这时可以改造 ConcreteBuilder 如下:
public class ConcreteBuilder implements Builder {
private String part1;
private String part2;
private String part3;
@Override
public void setPart1(String param) {
this.part1 = param;
}
@Override
public void setPart2(String param) {
this.part2 = param;
}
@Override
public void setPart3(String param) {
this.part3 = param;
}
@Override
public Product buildProduct() {
return new Product(this.part1, this.part2, this.part3);
}
}
也就是说这种情况下是在 buildProduct()被调用的时候才真正创建产品对象。
建造者模式在很多开源库中是很常见的模式,由于我是做 Android 开发的,在 Android 领域有很多开源库或者 Android 系统的 api 都是采用建造者模式,进一步,我们将 Builder 代码再稍微调整下:
public interface Builder {
public Builder setPart1(String param);
public Builder setPart2(String param);
public Builder setPart3(String param);
public Product buildProduct();
}
public class ConcreteBuilder implements Builder {
private String part1;
private String part2;
private String part3;
@Override
public ConcreteBuilder setPart1(String param) {
this.part1 = param;
return this;
}
@Override
public ConcreteBuilder setPart2(String param) {
this.part2 = param;
return this;
}
@Override
public ConcreteBuilder setPart3(String param) {
this.part3 = param;
return this;
}
@Override
public Product buildProduct() {
return new Product(this.part1, this.part2, this.part3);
}
}
public class Client {
public static void main(String[] args) {
//创建构造者
Builder builder = new ConcreteBuilder();
//构造者设置/构造产品的不同部分
Product product = builder.setPart1("param1")
.setPart2("param2")
.setPart3("param3")
.buildProduct();
//使用产品对象
System.out.println(product.getPart1());
System.out.println(product.getPart2());
System.out.println(product.getPart3());
}
}
如果你是做 Android 开发的同学,相信你已经看到了熟悉的代码,没错,就是链式调用的 Builder 模式,这种形式让书写更加方便,由于每次调用返回的是同一个对象,因此这样写也不违背迪米特法则。
建造者模式的优点
将一个复杂对象的创建过程封装起来。
允许对象通过多个步骤来创建,井且可以改变过程(这和只有一个步骤的工厂模式不同)
。
向客户隐藏产品内部的表现。
产品的实现可以被替换,因为客户只看到一个抽象的接口。
建造者模式的用途和缺点
经常被用来创建组合结构。与工厂模式相比,采用建造者模式创建对象的客户,需要具备更多的领城知识。
相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
产品类柞常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适。
参考:
评论