设计模式—建造者模式

151 阅读1分钟

建造者模式

定义

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

代码

比如现在要造不同的车子,车子的动作顺序可以自己定义,从而生成不同的车子

首先定义车子

public abstract class Car {
    private List<String> sequence = new ArrayList<>();
    public abstract void start();
    public abstract void stop();
    public abstract void alarm();
    final public void run(){
        for (String action : sequence) {
            if(action.equalsIgnoreCase("start")){
                this.start();
            }else if(action.equalsIgnoreCase("stop")){
                this.stop();
            }else if(action.equalsIgnoreCase("alarm")){
                this.alarm();
            }
        }
    }
    final public void setSequence(List<String> sequence) {
        this.sequence = sequence;
    }
}

上面定义了一个车子的模板,使用sequence来控制车子的动作顺序,下面定义实现类

public class CarA extends Car {

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

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

    @Override
    public void alarm() {
        System.out.println("car A alarm");
    }
}
public class CarB extends Car {
    @Override
    public void start() {
        System.out.println("car B start");
    }

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

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

现在车子有了,既然要造车子,现在定义建造者

public abstract class CarBuilder {
    //执行顺序
    public abstract void setSequence(List<String> sequence);
    //返回对象
    public abstract Car getCar();
}

public class CarABuilder extends CarBuilder {
    private Car carA = new CarA();

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

    @Override
    public Car getCar() {
        return this.carA;
    }
}
public class CarBBuilder extends CarBuilder {
    private Car carB = new CarB();
    @Override
    public void setSequence(List<String> sequence) {
        this.carB.setSequence(sequence);
    }

    @Override
    public Car getCar() {
        return this.carB;
    }
}

上面首先定义了建造者,需要传入顺序,然后返回对应的车子,现在只需要一个导演类来实现具体车子的顺序制造

public class Director {
    private List<String> sequence = new ArrayList<>();
    private CarBuilder aBuilder = new CarABuilder();
    private CarBuilder bBuilder = new CarBBuilder();

    public Car getCarA(){
        this.sequence.clear();
        this.sequence.add("stop");
        this.sequence.add("alarm");
        this.sequence.add("start");
        this.aBuilder.setSequence(this.sequence);
        return this.aBuilder.getCar();
    }

    public Car getCarB(){
        this.sequence.clear();
        this.sequence.add("alarm");
        this.sequence.add("stop");
        this.sequence.add("start");
        this.bBuilder.setSequence(this.sequence);
        return this.bBuilder.getCar();
    }
    //...其他类型(顺序)的CarA   CarB

}

测试:

 public void testBuilder(){

        Director director = new Director();
        director.getCarA().run();
        director.getCarB().run();

    }