第六话:设计模式之Builder模式(建造者模式)

什么是建造者模式

建造者又叫生成器模式,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象

设计图:

第六话:设计模式之Builder模式(建造者模式)_第1张图片
QQ截图20171204150649.png

代码:

Product:产品类
    private String head;
    private String body;
    set和get略;

说明:由一系列部件组成,一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。

Builder:建造者接口
public interface Builder {
    void builderBody();
    void builderHead();
    Product builderProduct();
}

说明:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者 (ConcreteBuilder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法(buildPart),另一种是返还结构方法(getResult)。一般来说,产品所包含的零件数目与建造方法的数目相符。换言之,有多少零件,就有多少相应的建造方法。
  引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。

lainBuilder:具体建造者

public class VillainBuilder implements Builder {
    Product product = new Product();
    @Override
    public void builderBody() {
        product.setBody("建造小人头");
    }
    @Override
    public void builderHead() {
        product.setHead("建造小人身体");
    }
    @Override
    public Product builderProduct(){
        return product;
    }
}

说明: 实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。

Director:导演者类
public void setDirectorBuilder(Builder builder){
        builder.builderBody();
        builder.builderHead();
}

说明:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变、及其复杂的部分。导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。导演者角色是与客户端打交道的角色。导演者将客户端创建产品的请求划分为对各个零件的建造请求,再将这些请求委派给具体建造者角色。具体建造者角色是做具体建造工作的,但是却不为客户端所知。

MainClass:调用类
public static void main(String[] args) {
        Builder builder = new VillainBuilder();
        Director director = new Director();
        director.setDirectorBuilder(builder);
        Product product = builder.builderProduct();
        
        System.out.println(product.getHead());
        System.out.println(product.getBody());
}

与工厂模式的区别

  • 建造者模式与工厂模式是极为相似的,总体上,建造者模式仅仅只比工厂模式多了一个“导演类”的角色。在建造者模式的类图中,假如把这个导演类看做是最终调用的客户端,那么图中剩余的部分就可以看作是一个简单的工厂模式了。
  • 与工厂模式相比,建造者模式一般用来创建更为复杂的对象,因为对象的创建过程更为复杂,因此将对象的创建过程独立出来组成一个新的类——导演类。也就是说,工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

优点

  • 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此,将主要的业务逻辑封装在导演类中对整体而言可以取得比较好的稳定性。
  • 其次,建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。

建造者模式应用场景

  1. 需要生成的产品对象有复杂的内部结构,每一个内部成分本身可以是对象,也可以仅仅是一个对象(即产品对象)的一个组成部分。
  2. 需要生成的产品对象的属性相互依赖。建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想。
  3. 在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。

总结

当你使用工厂模式写逻辑的时候还是觉得很复杂,那么请用建造者模式。

参考文章

23种设计模式(4):建造者模式
《JAVA与模式》之建造模式

留言:小弟初来乍到,不懂方何,如有问题,望指点一二,谢谢!

你可能感兴趣的:(第六话:设计模式之Builder模式(建造者模式))