設計模式之建造者設計模式

這是設計模式系列的第二篇——建造者設計模式,我希望推送的文章是一個系列的,盡量保持一樣的寫作風格,盡量把我理解的闡述清楚,關于建造者設計模式主要從以下幾個方面來學習,具體如下:

  1. 概述
  2. 本質
  3. 關鍵概念
  4. 具體實現(xiàn)
  5. 總結

概述

建造者設計模式(Builder Pattern)屬于創(chuàng)建型設計模式,主要用于創(chuàng)建復雜的對象,可將復雜對象的構建過程抽象出來,通過不同實現(xiàn)的構建者和裝配者最終組裝出不同的對象,可以非常方便的增加不同實現(xiàn)的構建者、組裝者而不用修改以前的代碼。

本質

建造者設計模式(Builder Pattern)分離了對象子組件的構造過程和組裝過程,實現(xiàn)了構建與組裝的解耦,不同的構建器相同的組裝順序以及相同的構建器不同的組裝順序都可以創(chuàng)建出不同的對象,使得構建與組裝充分解耦,進而實現(xiàn)構建算法與組裝算法的解耦,從而實現(xiàn)更好的復用。

關鍵概念

  • 構建者(Builder):構建不同的子組件且返回子組件或者提供獲取復雜對象的方法,將構建過程抽象成接口或抽象類,方便擴展具體的不同的構建者。

  • 組裝者(Dirctor):通過某個具體的構建者構建相關的子組件,同時對外提供組成復雜產(chǎn)品對象的方法。

當需要生成復雜對象時,直接通過某個具體的組裝者獲得想要的具體對象即可,至于組裝過程與構建過程使用者不需要關心,分別由具體的組裝者與具體的構建者內部完成。當然復雜對象可以理解為具有很多屬性的對象。

具體實現(xiàn)

下面以手機的組裝過程來說明建造者設計模式的具體實現(xiàn),產(chǎn)品類如下:

/**
 * 產(chǎn)品
 * @author jzman
 */
public class Phone {
    private Screen screen;
    private Camera camera;
    private Cpu cpu;
    //省略getter、setter、toString 方法
    //...
}

//子組件
class Screen{
    private String name;
    //...
}
//子組件
class Camera{
    private String name;
    //...
}
//子組件
class Cpu{
    private String name;
    //...
}

抽象的構建者:

/**
 * 構建者
 * @author jzman
 */
public interface PhoneBuilder {
    Screen builderScreen();
    Camera builderCamera();
    Cpu builderCpu();
}

具體的構建者:

/**
 * 具體的構建者
 * @author jzman
 */
public class MiPhoneBuilder implements PhoneBuilder{

    @Override
    public Screen builderScreen() {
        System.out.println("構建屏幕...");
        return new Screen("Mi-screen");
    }

    @Override
    public Camera builderCamera() {
        System.out.println("構建相機...");
        return new Camera("Mi-camera");
    }

    @Override
    public Cpu builderCpu() {
        System.out.println("構建屏幕...");
        return new Cpu("Mi-cpu");
    }
}

抽象的組裝者:

/**
 * 抽象的組裝者
 * @author jzman
 */
public interface PhoneDirector {
    Phone directPhone();
}

具體的構建者:

/**
 * 具體的組裝者
 * @author jzman
 */
public class MiPhoneDirector implements PhoneDirector{
    private PhoneBuilder builder;
    
    public MiPhoneDirector(PhoneBuilder builder) {
        this.builder = builder;
    }

    @Override
    public Phone directPhone() {
        Phone phone = new Phone();
        phone.setScreen(builder.builderScreen());
        phone.setCamera(builder.builderCamera());
        phone.setCpu(builder.builderCpu());
        return phone;
    }
}

使用者直接通過某個具體的組裝者獲取最終的產(chǎn)品,具體如下:

public class Client {
    public static void main(String[] args) {
        PhoneBuilder builder = new MiPhoneBuilder();
        MiPhoneDirector director = new MiPhoneDirector(builder);
        Phone phone = director.directPhone();
        System.out.println(phone);
    }
}

執(zhí)行結果如下:

構建屏幕...
構建相機...
構建屏幕...
Phone [screen=Screen [name=Mi-screen], camera=Camera [name=Mi-camera], cpu=Cpu [name=Mi-cpu]]

最終,使用者通過具體的組裝者 MiPhoneDirector 組裝出一個具有明顯組裝特征的手機,即一個屏幕是 Mi-screen 、相機是 Mi-camera、CPU 是 Mi-cpu 的手機。

總結

建造者設計模式(Builder Pattern) 一般用于具有共同特性的復雜對象,其對象本身與構建、組裝過程分離,可做到復雜對象屬性的可配置,當然,如果復雜對象內部過于復雜,勢必會需要創(chuàng)建更多的構建者類,使得構建過程繁瑣,我覺得開發(fā)中使用建造者設計模式主要用來做一些封裝,使得代碼寫起來更靈活,如 Picasso、Glide 的 API 就有建造者設計模式的使用,使得復雜對象的一些屬性可以做到可配置,非常方便。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容