设计模式——建造者模式

建造者模式

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

  1. 分离了部件的构造和装配, 从而可以构造出复杂对象, 适用于某个对象构造复杂的情况
  2. 由于构造和装配解耦, 不同构造器相同装配顺序也可以构造出不同的对象, 相同的构造器不同的装配顺序也可以做出不同的对象
  3. 建造者模式将部件和构造分开, 一步一步创建一个复杂对象, 用户只需要指定复杂对象的类型就可以得到该对象, 无需知道细节

结构:

  1. 抽象建造者类: 这个接口规定实现复杂对象的哪些部分的创建, 并不设计具体对象部件的创建
  2. 具体建造者类: 实现抽象建造者类接口, 完成复杂产品各个部件的具体创建方法, 构造过程完成后, 提供产品实例
  3. 产品类: 要创建的复杂对象
  4. 指挥者类: 调用具体创建者来创建复杂对象的各个部分, 在指挥者类中不设计具体产品的信息, 只保证对象各部分完整创建或按某种顺序创建

实现:

例: 生产自行车, 包含了车架, 车座等组件的生产, 车架又有碳纤维, 铝合金等材质, 车座有橡胶真皮等材质

抽象建造者类

/**
 * 抽象建造者
 */
public abstract class Builder {

    // 声明产品类型变量, 并且进行赋值
    protected Bike bike = new Bike();

    public abstract void buildFrame();

    public abstract void buildSeat();

    public abstract Bike createBike();


}

具体建造者类

/**
 * 具体建造者
 */
public class MobileBikeBuilder extends Builder{
    public void buildFrame() {
        bike.setFrame("碳纤维车架");
    }

    public void buildSeat() {
        bike.setSeat("真皮座椅");
    }

    public Bike createBike() {
        return bike;
    }
}

/**
 * 具体建造者
 */
public class OfoBikeBuilder extends Builder{
    public void buildFrame() {
        bike.setFrame("铝合金车架");
    }

    public void buildSeat() {
        bike.setSeat("橡胶座椅");
    }

    public Bike createBike() {
        return bike;
    }
}

产品类

/**
 * 产品
 */
@Data
public class Bike {

    private String seat;

    private String frame;

}

指挥者类

/**
 * 指挥者类
 */
@AllArgsConstructor
public class Director {

    private Builder builder;

    public Bike construct() {
        builder.buildFrame();
        builder.buildSeat();
        return builder.createBike();
    }

}

Main

/**
 * 建造者模式
 * 优点:
 * 1. 封装性好, 建造者模式中产品类和建造者类是比较稳定的,
 * 因此将主要逻辑放到指挥者类中可以取得较好的稳定性
 *
 * 2. 建造者模式中, 客户端不必知道内部细节, 将产品本身与产品构建过程解耦,
 * 使得相同的创建过程可以有不同的对象
 *
 * 3. 可以更加精细的控制产品的创建过程, 将复杂产品创建过程分解在不同方法中,
 * 使得创建过程更加清晰, 方便使用程序来控制创建过程
 *
 * 4. 建造模式很容易进行扩展, 如果有新需求, 通过实现一个新的建造类即可
 *
 * 缺点:
 * 1. 建造者模式创建出的产品一般具有较多共同点, 组成部分相似, 如果产品之间差异性大则不适合使用
 */
public class Main {
    public static void main(String[] args) {
        Builder builder1 = new MobileBikeBuilder();
        Builder builder2 = new OfoBikeBuilder();

        Director director1 = new Director(builder1);
        System.out.println(director1.construct());

        Director director2 = new Director(builder2);
        System.out.println(director2.construct());
    }
}

注意: 如果需要简化系统结构, 可以将指挥者类与抽象建造者类进行结合, 但是这样会加重Builder的职责, 如果construct()过于复杂, 还是放到指挥者类中更好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值