JAVA设计模式之建造者模式

439 阅读2分钟

本文介绍23种设计模式之建造者模式。

定义

封装一个产品的构造过程,并允许按照步骤构造。

描述

  • 模式名称:BUILDER(建造者)
  • 类型:对象创建型模式
  • 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 适用性:
    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    • 当构造过程必须允许被构造的对象有不同的表示时。
  • 效果:
  • 优点:
    • 它使你可以改变一个产品的内部表示,在改变该产品的内部表示时所要做的只是定义一个新的生成器。
    • 它将构造代码和表示代码分开。
    • 使你可对构造过程进行更精细的控制。
  • 缺点:
    • 产品必须有共同点,范围有限制。
    • 如内部变化复杂,会有很多的建造类。

类图

1629284479.png

  1. 产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。
  2. 抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法。
  3. 具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
  4. 指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。

整体流程就是:客户端调用指挥者,向指挥者传入建造者,通过建造者的方法按照指定流程生成产品,返回给客户端。也可以省略指挥者,由建造者控制流程。

实现代码

产品角色

public class Vacation {

    private String day;
    private String hotel;
    private String activity;

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        this.day = day;
    }

    public String getHotel() {
        return hotel;
    }

    public void setHotel(String hotel) {
        this.hotel = hotel;
    }

    public String getActivity() {
        return activity;
    }

    public void setActivity(String activity) {
        this.activity = activity;
    }
}

抽象建造者(Builder)

public abstract class AbstractBuilder {
    protected Vacation product = new Vacation();

    abstract void buildDay();

    abstract void buildHotel();

    abstract void buildActivity();

    abstract Vacation build();
}

具体建造者(Concrete Builder)

public class VacationBuilder extends AbstractBuilder {

    @Override
    void buildDay() {
        product.setDay("建造天数");
    }

    @Override
    void buildHotel() {
        product.setHotel("建造旅馆");
    }

    @Override
    void buildActivity() {
        product.setActivity("建造活动");
    }

    @Override
    Vacation build() {
        return product;
    }
}

指挥者(Director)

public class Director {
    private AbstractBuilder builder;

    public Director(AbstractBuilder builder){
        this.builder = builder;
    }

    public Vacation construct(){
        //规定组装流程
        builder.buildDay();
        builder.buildHotel();
        builder.buildActivity();
        return builder.build();
    }
}