定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
应用场景
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
UML
从上图可以看出Builder是为创建一个Product对象的各个部件指定的抽象接口,Prodcut是具体的产品。Director是一个建造者,由它指挥使用BUilder。ConcreteBuilder是具体的建造,实现Builder接口的各个方法
Builder:为创建一个产品对象的各个部件指定抽象接口。
ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
Director:构造一个使用Builder接口的对象。
Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
具体的产品Product
public class Product {
private String basic;//地基
private String wall;//墙
private String roofed;//楼顶
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
}
抽象建造
public interface Builder {
/**
* 打基础
*/
public void buildBasic();
/**
* 砌墙
*/
public void buildWalls();
/**
* 封顶
*/
public void roofed();
/**
* 造房子
* @return
*/
public Product buildProduct();
}
具体建造
public class ConcreteBuilder implements Builder{
private Product product;
public ConcreteBuilder(){
product=new Product();
}
@Override
public void buildBasic() {
product.setBasic("打好基础");
}
@Override
public void buildWalls() {
product.setWall("砌墙");
}
@Override
public void roofed() {
product.setRoofed("封顶大吉");
}
@Override
public Product buildProduct() {
return product;
}
}
建造者
public class Director {
public Product constructProduct(ConcreteBuilder concreteBuilder){
concreteBuilder.buildBasic();
concreteBuilder.buildWalls();
concreteBuilder.roofed();
return concreteBuilder.buildProduct();
}
}
测试类
public class Director {
public Product constructProduct(ConcreteBuilder concreteBuilder){
concreteBuilder.buildBasic();
concreteBuilder.buildWalls();
concreteBuilder.roofed();
return concreteBuilder.buildProduct();
}
}
优点
降低代码耦合度。在建造者模式中,客户端不需要知道产品内部是如何实现的,我们只需得到产品的对象。并且使用导演者和建造者分离组装过程和组件具体构造过程,具有灵活的扩展性。
优秀的扩展性。具体建造者相互独立,方便扩展,符合开闭原则。
缺点
- 一定的使用范围限制。建造者模式的产品的组件基本相同,如果产品的差异性较大,建造者模式就不适用了。
总结
建造者这种设计模式在很多三方框架Retrofit、Okhttop被大量使用到,就是利用其构建和标识的分离特性,充分理解优缺点以后童鞋们可以考虑在实际项目中实际的去使用吧。