設計模式之建造者模式(Builder)

建造者模式

    建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個複雜的對象。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
    一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立於其他對象的。

介紹

    意圖:將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
    主要解決:主要解決在軟件系統中,有時候面臨着”一個複雜對象”的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。
    何時使用:一些基本部件不會變,而其組合經常變化的時候。
    如何解決:將變與不變分離開。
    關鍵代碼:建造者:創建和提供實例,導演:管理建造出來的實例的依賴關係。
    應用實例: 1、JAVA 中的 StringBuilder;2、EventBus對象的創建。
    優點: 1、建造者獨立,易擴展。 2、便於控制細節風險。
    缺點: 1、產品必須有共同點,範圍有限制。 2、如內部變化複雜,會有很多的建造類。
    使用場景: 1、需要生成的對象具有複雜的內部結構。 2、需要生成的對象內部屬性本身相互依賴。
    注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序。

框架

            這裏寫圖片描述

    在建造者模式中有四個成員:

        - Director:與用戶直接交互,掌控Build的順序,調用Builder中創建對象的方法;
        - Builder:各對象創建的方法類,實現ConcreteBuilder接口中定義的創建方法;
        - ConcreteBuilder:對象創建接口,將產品各部件的創建方法抽象到接口中;
        - Product:產品類,即最終要build的生成物。

實例

    接下來通過一個實例來演示建造者模式的工作方法,該實例通過建造者模式創建一個完整的IPhone對象:

1、定義產品類 IPhone

    IPhone中有Screen、MainBroad、CPU、Camera四個零件(此處簡化都爲String對象,在複雜情況下每個部件都應該是一個類,並且有自己的創建方法和順序)。

/**
 * Created by wise on 2018/6/14.
 */
public class IPhone {
    private String mScreen;
    private String mMainBroad;
    private String mCPU;
    private String mCamera;

    public String getScreen() {
        return mScreen;
    }

    public void setScreen(String screen) {
        mScreen = screen;
    }

    public String getMainBroad() {
        return mMainBroad;
    }

    public void setMainBroad(String mainBroad) {
        mMainBroad = mainBroad;
    }

    public String getCPU() {
        return mCPU;
    }

    public void setCPU(String CPU) {
        mCPU = CPU;
    }

    public String getCamera() {
        return mCamera;
    }

    public void setCamera(String camera) {
        mCamera = camera;
    }
}

2、抽象IPhoneBuild接口(ConcreteBuilder角色)

    IPhoneBuild中把建造IPhone的過程抽象爲接口,共有5個方法,分別是各模塊的建造方法和最後生成物的建造方法。

/**
 * Created by wise on 2018/6/14.
 */

public interface IPhoneBuild {
    public void buildScreen();
    public void buildMainBroad();
    public void buildCPU();
    public void buildCamera();

    public IPhone buildIPhone();
}

3、IPhoneBuild接口實現(Builder角色)

    然後在IPhoneBuilder中對上述接口進行具體實現,各模塊和生成物的詳細建造邏輯在這裏實現,此處扮演Builder的角色。

/**
 * Created by wise on 2018/6/14.
 */

public class IPhoneBuilder implements IPhoneBuild {
    private IPhone mIPhone;

    public IPhoneBuilder() {
        mIPhone = new IPhone();
    }

    @Override
    public void buildScreen() {
        Log.d("build","Screen has been build");
        mIPhone.setScreen("OLED");
    }

    @Override
    public void buildMainBroad() {
        Log.d("build","MainBroad has been build");
        mIPhone.setMainBroad("Samsung");
    }

    @Override
    public void buildCPU() {
        Log.d("build","CPU has been build");
        mIPhone.setCPU("Snapdragon");
    }

    @Override
    public void buildCamera() {
        Log.d("build","Camera has been build");
        mIPhone.setCamera("Sony");
    }

    @Override
    public IPhone buildIPhone() {
        return mIPhone;
    }
}

4、IPhoneDirect(Director角色)

    IPhoneDirect爲直接與用戶交互的類,此處調用了各模塊的建造方法,並且在這裏控制模塊建造與否、順序邏輯,並最終組裝成生成物返回給用戶。

/**
 * Created by wise on 2018/6/14.
 */

public class IPhoneDirect {
    private IPhoneBuilder mIPhoneBuilder;

    public IPhoneDirect(IPhoneBuilder iPhoneBuilder){
        mIPhoneBuilder = iPhoneBuilder;
    }

    public IPhone build(){
        mIPhoneBuilder.buildCamera();
        mIPhoneBuilder.buildCPU();
        mIPhoneBuilder.buildMainBroad();
        mIPhoneBuilder.buildScreen();
        return mIPhoneBuilder.buildIPhone();
    }
}

5、實例調用

    此處演示在Activity中通過Direct對象完成一個IPhone對象的創建過程,在實際應用中上述的每一環節都要比此Demo中所寫的要複雜很多,尤其是每個模塊的建造過程和最終在Director中建造、組裝的順序是Build模式最獨特和關鍵的特點。

public class BuildActivity extends AppCompatActivity {

    private IPhone myIPhone;
    private IPhoneDirect mIPhoneDirect;
    private TextView tv_ShowInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_build);
        tv_ShowInfo = (TextView) findViewById(R.id.tv_showInfo);
        mIPhoneDirect = new IPhoneDirect(new IPhoneBuilder());
        myIPhone = mIPhoneDirect.build();
        tv_ShowInfo.setText(myIPhone.getCamera() + "," + myIPhone.getCPU() + "," + myIPhone.getMainBroad() + "," + myIPhone.getScreen());
    }
}

參考

菜鳥教程:建造者模式

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