每天一个设计模式之(4)-----建造者模式

1.为什么要使用建造者模式

    建造者模式的定义是: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 我们常常会在一些框架的使用中有这样的用法:

    Builder.setXXX().setYYY().setZZZ().build();

    这种用法其实就是使用了建造者模式,它使得前面的几个方法是构建,最后一个步骤是生成。

2.先上一波类图

    接上一篇模板方法的例子,现在多了一个需求,有的车的run()是先按喇叭再启动,有的车是先启动再按喇叭,那么我们就在抽象车里面增加一个表示顺序的ArrayList,调用run()的时候,根据ArrayList去遍历顺序。

    核心的就是中间的CarBuilder了,setSequence()就是表示对象的构建过程,buildCar()就是对象的构建了。Derictor,调用了CarBuilder,并封装了两个造车的方法(这一步并不属于建造者模式)

3.建造者模式的实现

Car相关的类

public abstract class AbstractCar {

    private ArrayList sequence;//顺序

    //启动
    protected abstract void start();
    //喇叭
    protected abstract void alarm();
    //熄火
    protected abstract void stop();

    public final void run(){
        // 根据 ArrayList 进行遍历,表示顺序
        for (int i = 0; i < this.sequence.size(); i++) {

            if("start".equals(this.sequence.get(i))){
                this.start();
            }
            if("alarm".equals(this.sequence.get(i))){
                this.alarm();
            }
            if("stop".equals(this.sequence.get(i))){
                this.stop();
            }
        }
    }

    final void setSequence(ArrayList sequence){
        this.sequence = sequence;
    }
}

public class BenZ extends AbstractCar{

    @Override
    public void start() {
        System.out.println("BenZ start");
    }

    @Override
    public void alarm() {
        System.out.println("BenZ alarm");
    }

    @Override
    public void stop() {
        System.out.println("BenZ stop");
    }
}

public class BMW extends AbstractCar{

    @Override
    public void start() {
        System.out.println("BMW start");
    }

    @Override
    public void alarm() {
        System.out.println("BMW alarm");
    }

    @Override
    public void stop() {
        System.out.println("BMW stop");
    }
}

建造者相关的类

public abstract class CarBuilder {

    //设置顺序
    public abstract void setSequence(ArrayList<String> sequence);

    //建造车
    public abstract AbstractCar buildCar();
}


public class BenZBuilder extends CarBuilder{

    private BenZ benZ = new BenZ();

    @Override
    public void setSequence(ArrayList<String> sequence) {
        this.benZ.setSequence(sequence);
    }

    @Override
    public AbstractCar buildCar() {
        return this.benZ;
    }
}

public class BMWBuilder extends CarBuilder{

    private BMW bmw = new BMW();

    @Override
    public void setSequence(ArrayList<String> sequence) {
        this.bmw.setSequence(sequence);
    }

    @Override
    public AbstractCar buildCar() {
        return this.bmw;
    }
}

导演类

/**
 * 封装一层
 */
public class Derictor {

    private ArrayList sequence = new ArrayList();
    private CarBuilder carBuilder;

    public BenZ getBenZ(){
        sequence.clear();
        this.sequence.add("start");
        this.sequence.add("alarm");
        this.sequence.add("stop");
        carBuilder = new BenZBuilder();
        carBuilder.setSequence(this.sequence);
        return (BenZ) carBuilder.buildCar();
    }

    public BMW getBMW(){
        sequence.clear();
        this.sequence.add("alarm");
        this.sequence.add("start");
        this.sequence.add("stop");
        carBuilder = new BMWBuilder();
        carBuilder.setSequence(this.sequence);
        return (BMW) carBuilder.buildCar();
    }
}

main方法

public class Main {

    public static void main(String[] args) {
        //先把创造者创建出来
        CarBuilder builder = new BenZBuilder();

        //自定义顺序
        ArrayList<String> sequence = new ArrayList<String>();
        sequence.add("alarm");
        sequence.add("start");
        sequence.add("stop");
        builder.setSequence(sequence);

        //开始建造汽车,按照自定义的顺序
        AbstractCar car = builder.buildCar();
        car.run();

        //完整的建造者模式,封装后的操作,其实和上面没什么差别,
        //只是一种车的顺序是固定的,所以就加一层封装
        Derictor derictor = new Derictor();
        derictor.getBenZ().run();
        derictor.getBMW().run();
    }

}

 

转载于:https://my.oschina.net/u/3582320/blog/1162395

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值