設計模式(5)-建造者模式

定義

產品由不同零件組裝而成,當傳入不同的組裝順序後,可以獲得不同的產品.


示例

汽車組裝由四個不同的零件完成,分別爲大燈,發動機,輪子,其他.
寶馬A系列和寶馬B系列組裝步驟不同.
奔馳A系列和奔馳B系列組裝步驟不同.


1.抽象產品類

public abstract class CarModel {
    //組裝順序列表
    private ArrayList<String> sequence = new ArrayList<String>();
    final protected void setSequence(ArrayList<String> sequence){
        this.sequence = sequence;
    }

    //遍歷sequence中的執行步驟,依次執行.結合了模板模式
    final protected void run(){
        for(int i=0; i<sequence.size();i++){
            String actionName = sequence.get(i);
            if(actionName.equalsIgnoreCase("installLight")){
                this.installLight();
            }
            if(actionName.equalsIgnoreCase("installEngine")){
                this.installEngine();
            }
            if(actionName.equalsIgnoreCase("installWheel")){
                this.installWheel();
            }
            if(actionName.equalsIgnoreCase("installOther")){
                this.installOther();
            }
        }
    }


    protected abstract void installLight(); //組裝大燈
    protected abstract void installEngine();    //組裝發動機
    protected abstract void installWheel(); //組裝輪子
    protected abstract void installOther(); //組裝其他
}

2.具體產品類

public class BMWModel extends CarModel{
    @Override
    protected void installLight() {
        System.out.println("寶馬組裝大燈!!!");
    }

    @Override
    protected void installEngine() {
        System.out.println("寶馬組裝發動機!!!");
    }

    @Override
    protected void installWheel() {
        System.out.println("寶馬組裝輪子!!!");
    }

    @Override
    protected void installOther() {
        System.out.println("寶馬組裝其他!!!");
    }
}
public class BenzModel extends CarModel{
    @Override
    protected void installLight() {
        System.out.println("奔馳組裝大燈!!!");
    }

    @Override
    protected void installEngine() {
        System.out.println("奔馳組裝發動機!!!");
    }

    @Override
    protected void installWheel() {
        System.out.println("奔馳組裝輪子!!!");
    }

    @Override
    protected void installOther() {
        System.out.println("奔馳組裝其他!!!");
    }
}

3.抽象建造者

public abstract class CarBuilder {
    protected abstract void setSequence(ArrayList<String> sequence);
    protected abstract CarModel getCarModel();
}

4.具體建造者

public class BMWBuilder extends CarBuilder{
    private BMWModel bmwModel = new BMWModel();
    @Override
    protected void setSequence(ArrayList<String> sequence) {
        bmwModel.setSequence(sequence);
    }

    @Override
    protected CarModel getCarModel() {
        return bmwModel;
    }
}
public class BenzBuilder extends CarBuilder{
    private BenzModel benzModel = new BenzModel();

    @Override
    protected void setSequence(ArrayList<String> sequence) {
        benzModel.setSequence(sequence);
    }

    @Override
    protected CarModel getCarModel() {
        return benzModel;
    }
}

5.運行

public static void main(String[] args) {
        BenzBuilder benzBuilder = new BenzBuilder();
        BMWBuilder bmwBuilder = new BMWBuilder();

        System.out.println("================奔馳A系列組裝順序爲:");
        ArrayList<String> sequenceBenzA = new ArrayList<String>();
        sequenceBenzA.add("installLight");
        sequenceBenzA.add("installEngine");
        sequenceBenzA.add("installWheel");
        sequenceBenzA.add("installOther");

        benzBuilder.setSequence(sequenceBenzA);
        CarModel benzModelA  = benzBuilder.getCarModel();
        benzModelA.run();

        System.out.println("================奔馳B系列組裝順序爲:");
        ArrayList<String> sequenceBenzB = new ArrayList<String>();
        sequenceBenzB.add("installOther");
        sequenceBenzB.add("installEngine");
        sequenceBenzB.add("installWheel");
        sequenceBenzB.add("installLight");

        benzBuilder.setSequence(sequenceBenzA);
        CarModel benzModelB  = benzBuilder.getCarModel();
        benzModelB.run();   

        System.out.println("================寶馬A系列組裝順序爲:");
        ArrayList<String> sequenceBmwA = new ArrayList<String>();
        sequenceBmwA.add("installLight");
        sequenceBmwA.add("installEngine");
        sequenceBmwA.add("installWheel");
        sequenceBmwA.add("installOther");

        bmwBuilder.setSequence(sequenceBmwA);
        CarModel bmwModel  = bmwBuilder.getCarModel();
        bmwModel.run(); 

        System.out.println("================寶馬B系列組裝順序爲:");
        ArrayList<String> sequenceBmwB = new ArrayList<String>();
        sequenceBmwB.add("installLight");
        sequenceBmwB.add("installWheel");
        sequenceBmwB.add("installEngine");
        sequenceBmwB.add("installOther");

        bmwBuilder.setSequence(sequenceBmwB);
        CarModel bmwModelB  = bmwBuilder.getCarModel();
        bmwModelB.run();    

    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章