設計模式之建造者模式

定義:
將一個複雜的構建和它的表示相分離,使得同樣的構建過程可以創建不同的表示。

角色:
在一個標準的建造者模式中有這幾個角色:
1、抽象建造者(Builder):爲創建一個產品對象的各個部件指定抽象接口。
2、具體建造者(ConcreteBuilder):實現Builder的接口以構造和裝配該產品的各個部件,定義並明確它所創建的表示,並提供一個檢索產品的接口。
3、設計者或指導者(Director):構造一個使用Builder接口的對象,指導構建過程。
4、產品(Product):表示被構造的複雜對象。ConcreteBuilder創建該產品的內部表示並定義它的裝配過程,包含定義組成部件的類,包括將這些部件裝配成最終產品的接口。

以建造房子爲例說下建造者模式,很多時候建造房子或者房子裝修,消費者首先找的是設計師,設計師將圖紙設計出來後,再去找到相應的工人去施工,工人安裝消費者和設計師的圖紙將房子建造好並交付給消費者。

大致流程圖:
這裏寫圖片描述

定義出消費者心中的房子,也就是產品,需要建造什麼樣子的房子;
產品(Product):

/**
 * 需要建造的房子類
 * 首先要描述下房子要建造什麼,建造成什麼樣子
 *
 * Created by Administrator on 2017/10/8.
 */

public class House {
    private String window;
    private String floor;

    public String getWindow() {
        return window;
    }

    public String getFloor() {
        return floor;
    }

    public void setWindow(String window) {
        this.window = window;
    }

    public void setFloor(String floor) {
        this.floor = floor;
    }
}

設計師根據房屋消費者的需求設計出相應的圖紙,但是設計師並不進行相應的建造,而是將圖紙給工人指導工人建造房子;
設計者或指導者(Director):

/**
 * 指導者
 * 對於建造房子而言就相當對設計師
 * 設計師將設計好的房屋圖紙給具體的工人進行建造
 * Created by Administrator on 2017/10/8.
 */

public class Designer {
    public void order(Build build){
        //建造地板
        build.makeFloor();
        //建造窗戶
        build.makeWindow();
    }
}

根據產品定義出產品對象各個部件的接口,即抽象建造者;
抽象建造者(Builder):

/**
 * 建造者角色
 * 工人接口,定義了工人所需要進行的各項工作,並不具體負責建造房子
 *
 *同時房子是具體的工人(農民工)進行建造,需要返回房子的方法
 * Created by Administrator on 2017/10/8.
 */

public interface Build {
    /**
     * 建造窗戶
     */
    public void makeWindow();

    /**
     * 建造地板
     */
    public void makeFloor();

    /**
     * 獲取建造的房子對象
     * @return  返回對應的房子對象
     */
    public House getHouse();

}

定義對應的接口實現類,也就是具體的房屋建造者–工人,不過工人要按照設計師(指導者)的設計圖紙進行建造;
具體建造者(ConcreteBuilder):

/**
 * 房屋的具體建造者
 * Created by Administrator on 2017/10/8.
 */

public class WorkBuilder implements Build{
    private House house=new House();
    @Override
    public void makeWindow() {
        house.setWindow("建造窗戶完成");
    }

    @Override
    public void makeFloor() {
        house.setFloor("建造地板完成");
    }

    @Override
    public House getHouse() {
        return house;
    }
}

工人將房子建造好後,房屋消費者就可以得到房子了;

/**
 * 需求建造房子的消費者
 * Created by Administrator on 2017/10/8.
 */

public class Client {
    public void main(){
        //找到設計師
        Designer designer=new Designer();
        //設計師將設計好的圖紙交個工人進行施工
        WorkBuilder workBuilder=new WorkBuilder();
        designer.order(workBuilder);
        //工人將房子建好後給消費者
        House house = workBuilder.getHouse();
        Log.e("TAG",house.getWindow()+house.getFloor());
    }
}

以上就是一個標準的建造者模式,在實際項目中,很多的建造者模式的運用都是做了相應的變化的;也用建造房屋爲例,對建造者模式做相應變化並運用。

產品(Product):

/**
 * 需要建造的房子類
 * 首先要描述下房子要建造什麼,建造成什麼樣子
 * Created by Administrator on 2017/10/8.
 */

public class House {
    private String window;
    private String floor;

    public void apply(WorkBulder.HouseParmas parmas){
        this.window=parmas.window;
        this.floor=parmas.floor;
    }

    @Override
    public String toString() {
        return window+floor;
    }
}

具體建造者(ConcreteBuilder):

/**
 * 具體的房子建造者
 * Created by Administrator on 2017/10/8.
 */

public class WorkBulder {
    private HouseParmas parmas;

    public WorkBulder(){
        this.parmas=new HouseParmas();
    }
    public WorkBulder makeWindow(String window){
        parmas.window=window;
        return this;
    }
    public WorkBulder makeFloor(String floor){
        parmas.floor= floor;
        return this;
    }
    public House builder(){
        House house=new House();
        house.apply(parmas);
        return house;
    }
    class HouseParmas{
        public String window;
        public String floor;
    }
}

調用:

WorkBulder workBulder=new WorkBulder();
House builder = workBulder.makeFloor("建造地板").makeWindow("建造窗戶").builder();
Log.e("TAG",builder.toString());

上面就是變化後的建造者模式,和標準的建造模式相比少了 抽象建造者(Builder)和設計者或指導者(Director) 這兩個角色;這種變化後的建造者模式在項目開發中式碰到比較多的,系統的AlertDialog、glide等很多都是採用變化後的建造者模式。

發佈了80 篇原創文章 · 獲贊 32 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章