设计模式之建造者模式

22 篇文章 0 订阅
17 篇文章 0 订阅

建造者模式定义

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

使用场景

  • 创建复杂对象的算法独立于组成对象的部件
  • 同一个创建过程需要有不同的内部表象的产品对象

建造者模式构成

通用类图

这里写图片描述

角色
  • Product产品类
    表示被构造的复杂对象,当有许多产品类时,可以抽象出一个接口。

  • Builder抽象建造者
    该接口是所有具体创造者(ConcreteBuilder)的抽象接口,用以规范产品对象的各个部分的构建。该类包含两种方法:一种是建造对象组件的方法(BuildPart())、一种是返回产品对象的方法。

  • ConcreteBuilder具体建造者
    实现接口(Builder)定义的所有方法,并且返回一个建造好的产品对象。如果有多个产品类,那么也会有多个具体建造者与之一一对应。

  • Director导演类
    导演类负责把客户想要创建的产品对象请求委托给对应的建造者来创建产品,导演类不与产品类产生依赖关系,具体的创建过程是由具体建造者执行。

示例

该示例是建造自行车、电动车、摩托车的例子。利用建造者模式,以同一个创建过程建造不同的车类。

类图:

这里写图片描述

代码:

产品类接口CarModel

public interface CarModel {
    void installCarBody();
    void installPowerSystem();
    void installWheel();
}

产品Bike类

public class Bike implements CarModel{

    public void installCarBody() {
        System.out.println("安装自行车车身。");
    }

    public void installPowerSystem() {
        System.out.println("安装自行车动力系统:无。");
    }

    public void installWheel() {
        System.out.println("安装自行车车轮。");
    }
}

省略产品Electrombile类、Motorbike类,其代码和Bike类似,具体构建有差别。

抽象建造者CarBuilder

public interface CarBuilder {
    void buildCarBody();
    void buildPowerSystem();
    void buildWheel();
    CarModel buildCarModel();
}

具体构建者BikeBuilder

public class BikeBuilder implements CarBuilder {
    private Bike bike = new Bike();
    public void buildCarBody() {
        this.bike.installCarBody();
    }

    public void buildPowerSystem() {
        this.bike.installPowerSystem();
    }

    public void buildWheel() {
        this.bike.installWheel();
    }

    public CarModel buildCarModel() {
        return this.bike;
    }
}

同样省略ElectrombileBuilder和MotorbikeBuilder。

导演类Director

public class Director {
    private CarBuilder carBuilder;

    public Director(CarBuilder carBuilder) {
        this.carBuilder = carBuilder;
    }

    public CarModel constructCarModel() {
        this.carBuilder.buildCarBody();
        this.carBuilder.buildPowerSystem();
        this.carBuilder.buildWheel();
        return this.carBuilder.buildCarModel();
    }

}

客户测试类Client

public class Client {

    public static void main(String [] args) {
        BikeBuilder bikeBuilder = new BikeBuilder();
        Director director = new Director(bikeBuilder);
        Bike bike = (Bike)director.constructCarModel();

        ElectrombileBuilder electrombileBuilder = new ElectrombileBuilder();
        director = new Director(electrombileBuilder);
        Electrombile electrombile = (Electrombile)director.constructCarModel();

        MotorbikeBuilder motorbikeBuilder = new MotorbikeBuilder();
        director = new Director(motorbikeBuilder);
        Motorbike motorbike = (Motorbike)director.constructCarModel();
    }

}

输出:

安装自行车车身。
安装自行车动力系统:无。
安装自行车车轮。
安装电动车车身。
安装电动车动力系统:电力动力系统。
安装电动车车轮。
安装摩托车车身。
安装摩托车动力系统:汽油动力系统。
安装摩托车车轮。

代码下载https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/builder

建造者模式优点

  • 封装性
    使客户端不必知道产品内部组成的细节

  • 建造者独立,容易扩展

参考

  1. 设计模式之禅(第2版)
  2. 教你用设计模式之建造者模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值