设计模式之建造者模式

建造者模式属于创建型设计模式,我们经常需要创建一些对象,这个对象是由一些基本的部分组成的,但是考虑到各种情况,这些具体的部分会经常的发生改变,但是组织这些部件的顺序等等是不容易的变化的,这点类似乎模板方法模式遇到的使用场景,模板方法侧重点在于定义一个基本的算法骨架,建造者模式侧重点在于灵活的变更具体部件的实现。类图如下:
这里写图片描述
有三个角色需要解释:
1.Director类(导演类):维护一个Builder对象获取这些组件,这里定义组装顺序等等操作。不设计这些具体部件的实现。
2.Builder类(创建者):定义需要创建的组件的抽象方法。
3.ConcreteBuilder (具体的创建者):生产具体的部件实现。
接下来我就来举个建造者的例子:

// 需要构建的对象Car
class Car {
    private String wheel;
    private String engine;
    private String brand;

    public String getWheel() {
        return wheel;
    }

    public void setWheel(String wheel) {
        this.wheel = wheel;
    }

    public String getEngine() {
        return engine;
    }

    public void setEngine(String engine) {
        this.engine = engine;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    @Override
    public String toString() {
        return "Car [wheel=" + wheel + ", engine=" + engine + ", brand="
                + brand + "]";
    }

}

// 建造车的接口
abstract class BuildCar {
    // 定义具体的需要制造的部件
    abstract String getWheel();

    abstract String getEngine();

    abstract String getBrand();
}

// 建造者具体的实现类BMWBuild
class BMWBuild extends BuildCar {

    @Override
    String getWheel() {
        return "bmw wheel";
    }

    @Override
    String getEngine() {
        return "bmw engine";
    }

    @Override
    String getBrand() {
        return "bmw";
    }

}

// 建造者具体的实现类BenzBuild
class BenzBuild extends BuildCar {

    @Override
    String getWheel() {
        return "benz wheel";
    }

    @Override
    String getEngine() {
        return "benz engine";
    }

    @Override
    String getBrand() {
        return "benz brand";
    }

}

// 导演类,负责组装这些零部件的顺序等等工作
class Factory {
    // 维护一个建造者的抽象类(接口)
    private BuildCar builder;

    /*
     * Factory (BuildCar builder) { this.builder = builder; }
     */
    // 定义顺序
    public Car finishCar() {
        // 首先装轮胎
        Car car = new Car();

        car.setWheel(builder.getWheel());
        car.setEngine(builder.getEngine());
        car.setBrand(builder.getBrand());

        return car;
    }

    public BuildCar getBuilder() {
        return builder;
    }

    // 设置具体的建造者
    public void setBuilder(BuildCar builder) {
        this.builder = builder;
    }

}

测试:

        Factory factory = new Factory();

        factory.setBuilder(new BMWBuild());
        Car car = factory.finishCar();
        System.out.println(car);

        factory.setBuilder(new BenzBuild());
        car = factory.finishCar();
        System.out.println(car);

运行结果:

Car [wheel=bmw wheel, engine=bmw engine, brand=bmw]
Car [wheel=banz wheel, engine=benz engine, brand=benz brand]

我们如果有的新的具体组件的实现类,只需要增加新的类去集成实现Build即可。Director的组装顺序不需要改变,而且也不用改动原有的逻辑,符合开闭原则,也符合里氏替换原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值