java設計模式之建造者模式

一、建造者模式也叫生成器模式,其定義以下:將一個複雜對象的構建與它的表示分離, 使得一樣的構建過程能夠建立不一樣的表示。java

二、建造者模式通用類圖以下:ide

 

 

 

 

三、建造者模式有以下4個角色:product產品類、builder抽象建造者、concreteBuilder具體建造者、director導演類。ui

相關代碼以下:this

產品類spa

import java.util.ArrayList;

/**
 * 車輛模型抽象類
 *
 */
public abstract class CarModel {

    //這個參數是各個基本方法執行的順序
    private ArrayList<String> sequence = new ArrayList<>();
    //模型是啓動開始跑了
    protected abstract void start();
    //能發動,還要能停下來,那纔是真本事
    protected abstract void stop();
    //喇叭會出聲音
    protected abstract void alarm();
    //引擎發動
    protected abstract void engineBoom();
    //模型動起來
    final public void run() {
        //循環一遍,誰在前,就先執行誰
        for (int i = 0; i < sequence.size(); i++) {
            String actionName = this.sequence.get(i);
            if ("start".equalsIgnoreCase(actionName)) {
                this.start();
            } else if ("stop".equalsIgnoreCase(actionName)) {
                this.stop();
            } else if ("alarm".equalsIgnoreCase(actionName)) {
                this.alarm();
            } else if ("engineBoom".equalsIgnoreCase(actionName)) {
                this.engineBoom();
            }
        }
    }
    
    final public void setSequence(ArrayList sequence) {
        this.sequence = sequence;
    }
    
}
/**
 * 奔馳車模型
 *
 */
public class BenzModel extends CarModel {

    @Override
    protected void start() {
        System.out.println("奔馳車啓動。。。");
    }

    @Override
    protected void stop() {
        System.out.println("奔馳車停下。。。");
    }

    @Override
    protected void alarm() {
        System.out.println("奔馳車喇叭聲。。。");
    }

    @Override
    protected void engineBoom() {
        System.out.println("奔馳車引擎聲。。。");        
    }

}
/**
 * 寶馬車模型
 *
 */
public class BMWModel extends CarModel {

    @Override
    protected void start() {
        System.out.println("寶馬車啓動。。。");
    }

    @Override
    protected void stop() {
        System.out.println("寶馬車停下。。。");
    }

    @Override
    protected void alarm() {
        System.out.println("寶馬車喇叭聲。。。");
    }

    @Override
    protected void engineBoom() {
        System.out.println("寶馬車引擎聲。。。");        
    }

}

建造者code

import java.util.ArrayList;

/**
 * 抽象汽車組裝者
 *
 */
public abstract class CarBuilder {

    //建造一個模型,你要給我一個順序要求,就是組裝順序
    public abstract void setSequence(ArrayList<String> sequence);
    //設置完畢順序後,就能夠直接拿到這個車輛模型
    public abstract CarModel getCarModel();
}
/**
 * 奔馳車組裝者
 *
 */
public class BenzBuilder extends CarBuilder {
    
    private BenzModel benz = new BenzModel();

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

    @Override
    public CarModel getCarModel() {
        return this.benz;
    }

}
/**
 * 寶馬車組裝者
 *
 */
public class BMWBuilder extends CarBuilder {
    
    private BMWModel bmw = new BMWModel();

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

    @Override
    public CarModel getCarModel() {
        return this.bmw;
    }

}

導演類對象

import java.util.ArrayList;

/**
 * 導演類
 *
 */
public class Director {

    private ArrayList<String> sequence = new ArrayList<>();
    private BenzBuilder benzBuilder = new BenzBuilder();
    private BMWBuilder bmwBuilder = new BMWBuilder();
    
    //A類型的奔馳車模型,先start,而後stop,其餘什麼引擎、喇叭一律沒有
    public BenzModel getABenzModel() {
        //清理場景
        this.sequence.clear();
        //執行順序
        this.sequence.add("start");
        this.sequence.add("stop");
        //按照順序返回一個奔馳車
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }
    
    //B類型的奔馳車模型,先發動引擎,而後啓動,而後中止,沒有喇叭
    public BenzModel getBBenzModel() {
        //清理場景
        this.sequence.clear();
        //執行順序
        this.sequence.add("engineBoom");
        this.sequence.add("start");
        this.sequence.add("stop");
        //按照順序返回一個奔馳車
        this.benzBuilder.setSequence(this.sequence);
        return (BenzModel) this.benzBuilder.getCarModel();
    }
    
    //C類型的寶馬車模型,先按下喇叭,而後啓動,而後中止
    public BMWModel getCBMWModel() {
        //清理場景
        this.sequence.clear();
        //執行順序
        this.sequence.add("alarm");
        this.sequence.add("start");
        this.sequence.add("stop");
        //按照順序返回一個奔馳車
        this.benzBuilder.setSequence(this.sequence);
        return (BMWModel) this.bmwBuilder.getCarModel();
    }
    
    //D類型的寶馬車模型只有一個功能,就是跑
    public BMWModel getDBMWModel() {
        //清理場景
        this.sequence.clear();
        //執行順序
        this.sequence.add("start");
        //按照順序返回一個奔馳車
        this.benzBuilder.setSequence(this.sequence);
        return (BMWModel) this.bmwBuilder.getCarModel();
    }
    
    /**
     * 還有不少其餘模型能夠添加實現
     */
}

客戶端blog

/**
 * 客戶端
 *
 */
public class Client {

    public static void main(String[] args) {
        Director director = new Director();
        //1萬輛A類型的奔馳車
        for(int i = 0; i < 10000; i++) {
            director.getABenzModel().run();
        }
        //100萬輛B類型的奔馳車
        for(int i = 0; i < 1000000; i++) {
            director.getBBenzModel().run();
        }
        //1000萬輛C類型的寶馬車
        for(int i = 0; i < 10000000; i++) {
            director.getCBMWModel().run();
        }
    }
}

四、建造者模式優勢事件

封裝性:
使用建造者模式能夠使客戶端沒必要知道產品內部組成的細節, 如例子中咱們就不須要關心每個具體的模型內部是如何實現的, 產生的對象類型就是CarModel。get

建造者獨立, 容易擴展:
BenzBuilder和BMWBuilder是相互獨立的, 對系統的擴展很是有利。

便於控制細節風險
因爲具體的建造者是獨立的, 所以能夠對建造過程逐步細化, 而不對其餘的模塊產生任何影響。

五、建造者模式使用場景

相同的方法, 不一樣的執行順序, 產生不一樣的事件結果時, 能夠採用建造者模式。

多個部件或零件, 均可以裝配到一個對象中, 可是產生的運行結果又不相同時, 則能夠使用該模式。

六、與工廠模式區別

建造者模式最主要的功能是基本方法的調用順序安排, 也就是這些基本方法已經實現了, 通俗地說就是零件的裝配, 順序不一樣產生的對象也不一樣; 而工廠方法則重點是建立, 建立零件是它的主要職責, 組裝順序則不是它關心的。

相關文章
相關標籤/搜索