26設計模式之建造者模式

建造者模式是非常常用的一種設計模式,安卓原生的比如StringBuilder、Dialog就是用的這種設計模式。如果滿足以下條件的時候可以考慮使用這種設計模式:

1、用來創建一個對象而這個對象是由各種屬性組成,創建步驟繁瑣。

2、對象的創建過程獨立於創建該對象的類。

3、隔離複雜對象的創建和使用,使得相同的創建過程能創建出不同的產品。

該模式的定義爲:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

一般該模式有下面4種角色:

product:需要創建的產品

builder:抽象的接口

concretebuilder:具體的接口類,提供一個方法用來創建product對象

director:用來指揮創建,一般用客戶端代替


下面就來用一個生產手機的例子來教大家使用這種模式,我們生產一個手機需要有手機的產品名稱,屏幕的材質,大小,cup型號,電池容量等。其實我們不想要抽象接口也能設計出這個demo,不過爲了提高程序的可擴展性和低耦合,還是希望大家按照正常的流程走,這樣你設計的程序纔可以更健壯。

我們先來看下效果圖:


佈局文件很簡單就不提供了,我們先來看看我們的產品類:

public class Phone {
    String battery, cup, screen, size,brand;

    public void setBattery(String battery) {
        this.battery = battery;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public void setCup(String cup) {
        this.cup = cup;
    }

    public void setScreen(String screen) {
        this.screen = screen;
    }

    public void setSize(String size) {
        this.size = size;
    }
}
只有一些屬性和set方法,很簡單,下面來看抽象的builder接口:

public interface PhoneBuilder {
    PhoneBuilder setCup(String cup);
    PhoneBuilder setScreen(String material);
    PhoneBuilder setSize(String size);
    PhoneBuilder setBattery(String battery);
    PhoneBuilder setBrand(String brand);
    Phone create();
}
也是很簡單,只有一些set方法和一個創建產品的create方法,下面看具體接口類:

public class ConcreteBuilder implements PhoneBuilder {
    private Phone phone = new Phone();
    @Override
    public ConcreteBuilder setCup(String cup) {
        phone.cup = cup;
        return this;
    }

    @Override
    public ConcreteBuilder setScreen(String material) {
        phone.screen = material;
        return this;
    }

    @Override
    public ConcreteBuilder setSize(String size) {
        phone.size = size;
        return this;
    }

    @Override
    public ConcreteBuilder setBattery(String battery) {
        phone.battery = battery;
        return this;
    }

    @Override
    public PhoneBuilder setBrand(String brand) {
        phone.brand = brand;
        return this;
    }

    public Phone create() {
        return phone;
    }

}

實現抽象接口,裏面有一個屬性是產品類,在create方法裏面返回產品類,這些代碼都是簡單的不需要加註釋,最後來看Activity類:

public class MainActivity extends AppCompatActivity {
    StringBuilder sb = new StringBuilder();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void saling(View view) {
        ConcreteBuilder iphoneBuilder = new ConcreteBuilder();
        Phone phone = iphoneBuilder.setSize("5.7英寸").setScreen("AMOLED").setBattery("3000毫安").setCup("驍龍820").setBrand("蘋果7").create();
        sb.append("品牌:" + phone.brand + "\r\n")
                .append("屏幕尺寸:" + phone.size + "\r\n")
                .append("屏幕材質:" + phone.screen + "\r\n")
                .append("CUP型號:" + phone.cup + "\r\n")
                .append("電池容量:" + phone.battery + "\r\n");
        //顯示結果
        ((TextView) findViewById(R.id.txtv)).setText(sb.toString());
    }

}
無需多言,類似AlertDialog裏面的風格,是不是很爽呢??代碼清晰明瞭。

掃描關注我的微信公衆號:




總結:

這種設計模式我們一定要熟練掌握,我們以後提供工具類給別人的時候記得優先考慮的風格就是調用方法後直接返回類本身,這樣就可以加快被人寫代碼的速度,看起來也更加清晰。設計模式都是用來解決一類問題的,而我們掌握的設計模式越多,我們的代碼風格也就越清晰優雅,跟着我的腳步我們一起慢慢的學習完26種設計模式吧!期待我以後更新的同時送上今天的demo福利:demo




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