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

這是設計模式系列的第二篇——建造者設計模式,我但願推送的文章是一個系列的,儘可能保持同樣的寫做風格,儘可能把我理解的闡述清楚,關於建造者設計模式主要從如下幾個方面來學習,具體以下:java

  1. 概述
  2. 本質
  3. 關鍵概念
  4. 具體實現
  5. 總結

概述

建造者設計模式(Builder Pattern)屬於建立型設計模式,主要用於建立複雜的對象,可將複雜對象的構建過程抽象出來,經過不一樣實現的構建者和裝配者最終組裝出不一樣的對象,能夠很是方便的增長不一樣實現的構建者、組裝者而不用修改之前的代碼。算法

本質

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

關鍵概念

  • 構建者(Builder):構建不一樣的子組件且返回子組件或者提供獲取複雜對象的方法,將構建過程抽象成接口或抽象類,方便擴展具體的不一樣的構建者。
  • 組裝者(Dirctor):經過某個具體的構建者構建相關的子組件,同時對外提供組成複雜產品對象的方法。

當須要生成複雜對象時,直接經過某個具體的組裝者得到想要的具體對象便可,至於組裝過程與構建過程使用者不須要關心,分別由具體的組裝者與具體的構建者內部完成。固然複雜對象能夠理解爲具備不少屬性的對象。微信

具體實現

下面以手機的組裝過程來講明建造者設計模式的具體實現,產品類以下:ide

/**
 * 產品
 * @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();
}

具體的構建者:ui

/**
 * 具體的構建者
 * @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");
    }
}

抽象的組裝者:this

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

具體的構建者:spa

/**
 * 具體的組裝者
 * @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;
    }
}

使用者直接經過某個具體的組裝者獲取最終的產品,具體以下:設計

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);
    }
}

執行結果以下:

構建屏幕...
構建相機...
構建屏幕...
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) 通常用於具備共同特性的複雜對象,其對象自己與構建、組裝過程分離,可作到複雜對象屬性的可配置,固然,若是複雜對象內部過於複雜,勢必會須要建立更多的構建者類,使得構建過程繁瑣,我以爲開發中使用建造者設計模式主要用來作一些封裝,使得代碼寫起來更靈活,如 Picasso、Glide 的 API 就有建造者設計模式的使用,使得複雜對象的一些屬性能夠作到可配置,很是方便。

能夠選擇關注微信公衆號:jzman-blog 獲取最新更新,一塊兒交流學習!

clipboard.png

相關文章
相關標籤/搜索