Android 设计模式-建造者模式(Builder Pattern)

定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

应用场景

需要生成的产品对象有复杂的内部结构,这些产品对象具备共性;
隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

UML

《Android 设计模式-建造者模式(Builder Pattern)》

从上图可以看出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被大量使用到,就是利用其构建和标识的分离特性,充分理解优缺点以后童鞋们可以考虑在实际项目中实际的去使用吧。

    原文作者:Code猎人
    原文地址: https://www.jianshu.com/p/73f4ba3a6ee0
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞