设计模式读书笔记-建造者模式

2016-08-21
读书笔记
  • 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
  • 与模板模式类似,建造者模式增加建造者且模板父类中增加了方法执行顺序变量sequence
  • 建造者实现两个方法:一个返回要建造的对象,另一个设置要建造的对象中的通用方法中调用自身方法的顺序
  • Client中实例sequence和具体Builder,并执行Builder中的model的某方法。
  • 具体建建类封装了构建细节,并返回构建好的对象。
  • 与工厂模式的区别:建造者模块关注方法执行的顺序(方法本身已实现),即零件的组装顺序不同产生的对象也不同;工厂模式关注零件本身的创建,不关注组装顺序。
  • 代码
public abstract class Model {

    private ArrayList<String> sequence = new ArrayList<String>();

    public final void setSequence(ArrayList<String> sequence){

        this.sequence = sequence;

    }

    final public void run(){

        for(int i=0;i<sequence.size();i++){

            String nowOrperate = sequence.get(i);

            if(nowOrperate.equals("start")){
                this.start();
            }else if(nowOrperate.equals("alarm")){
                this.alarm();
            }else if(nowOrperate.equals("stop")){
                this.stop();
            }

        }

    }

    protected abstract void start();

    protected abstract void alarm();

    protected abstract void stop();

}

public class ModelA extends Model{

    protected void start() {
        System.out.println("车辆A启动");
    }

    protected void alarm() {
        System.out.println("车辆A鸣笛");
    }

    protected void stop() {
        System.out.println("车辆A刹车");
    }

}

public class ModelB extends Model{

    protected void start() {
        System.out.println("车辆B启动");
    }

    protected void alarm() {
        System.out.println("车辆B鸣笛");
    }

    protected void stop() {
        System.out.println("车辆B刹车");
    }

}

public abstract class Builder {

    public abstract void setSequence(ArrayList<String> sequence);

    public abstract Model getModel();

}

public class BuilderA extends Builder{

    private ModelA modelA = new ModelA();

    public void setSequence(ArrayList<String> sequence) {
        modelA.setSequence(sequence);
    }

    public Model getModel() {
        return modelA;
    }

}

public class BuilderB extends Builder{

    private ModelB modelB = new ModelB();

    public void setSequence(ArrayList<String> sequence) {
        modelB.setSequence(sequence);
    }

    public Model getModel() {
        return modelB;
    }

}

public class Client {

    public static void main(String[] args){

        ArrayList<String> sequence1 = new ArrayList<String>();

        sequence1.add("alarm");
        sequence1.add("start");
        sequence1.add("stop");

        Builder builderA = new BuilderA();
        builderA.setSequence(sequence1);
        builderA.getModel().run();

        ArrayList<String> sequence2 = new ArrayList<String>();
        sequence2.add("start");
        sequence2.add("alarm");
        sequence2.add("stop");

        Builder builderB = new BuilderB();
        builderB.setSequence(sequence2);
        builderB.getModel().run();
    }

}

Kommentare: