定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
应用场景
需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
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(); }@Overridepublic void buildBasic() { product.setBasic("打好基础"); }@Overridepublic void buildWalls() { product.setWall("砌墙"); }@Overridepublic void roofed() { product.setRoofed("封顶大吉"); }@Overridepublic 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被大量使用到,就是利用其构建和标识的分离特性,充分理解优缺点以后童鞋们可以考虑在实际项目中实际的去使用吧。
作者:Code猎人
链接:https://www.jianshu.com/p/73f4ba3a6ee0