自由擴展你的項目——Builder模式

《Android源碼設計模式解析與實戰》讀書筆記(三) 《Android源碼設計模式解析與實戰》PDF資料下載php

1、Builder模式簡介

Builder模式是一步一步建立一個複雜對象的建立型模式,他容許用戶在不知道內部構建細節的狀況下,能夠更精細地控制對象的構造流程。設計模式

該模式是爲了將構建複雜對象的過程和它的部件解耦,使得構建過程和部件的表示隔離開來。bash

1.一、定義

將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。微信

1.二、使用場景

  1. 相同的方法,不一樣的執行順序,產生不一樣的事件結果時。
  2. 多個部件或零件,均可以裝配到一個對象中,可是產生的運行結果又不相同時。
  3. 產品類很是複雜,或者產品類中的調用順序不一樣產生了不一樣的做用,這個時候使用建造者模式很是適合。 4.當初始化一個對象特別複雜,如參數多,且不少參數都具備默認值時。

2、Builder模式的簡單實現

示例:將計算機組裝的過程簡化爲構建主機、設置操做系統、設置顯示器3個部分,而後經過Director和具體的Builder來構建計算機對象。ide

/**
 * 計算機抽象類,即Product角色
 */
public abstract class Computer {
    protected String mBoard;
    protected String mDisplay;
    protected String mOS;

    protected Computer() {}

    //設置CPU核心數
    public void setBoard(String board) {
        mBoard =board;
    }

    //設置內存
    public void setDisplay(String display) {
        mDisplay = display;
    }

    //設置操做系統
    public abstract void setOS();

    @Override
    public String toString() {
        return "Computer{" +
                "mBoard='" + mBoard + '\'' + ", mDisplay='" + mDisplay + '\'' + ", mOS='" + mOS + '\'' +
                '}';
    }
}
複製代碼
/**
 * 具體的Computer類,MacBook
 */
public class Macbook extends Computer {

    protected Macbook() {}

    @Override
    public void setOS() {
        mOS = "Mac OS X 10.10";
    }
}
複製代碼
/**
 * 抽象Builder類
 */
public abstract class Builder {
    //設置主機
    public abstract void buildBoard(String board);

    //設置顯示器
    public abstract void buildDisplay(String display);

    //設置操做系統
    public abstract void buildOS();

    //建立Computer
    public abstract Computer create();
}
複製代碼
/**
 * 具體的Builder類,MacbookBuilder
 */
public class MacbookBuilder extends Builder {
    private Computer mComputer = new Macbook();

    @Override
    public void buildBoard(String board) {
        mComputer.setBoard(board);
    }

    @Override
    public void buildDisplay(String display) {
        mComputer.setDisplay(display);
    }

    @Override
    public void buildOS() {
        mComputer.setOS();
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
複製代碼
/**
 * Director類,負責構造Computer
 */
public class Director {
    Builder mBuilder = null;

    public Director(Builder builder) {
        mBuilder = builder;
    }

    /**
     * 構建對象
     */
    public void construct(String board, String display) {
        mBuilder.buildBoard(board);
        mBuilder.buildDisplay(display);
        mBuilder.buildOS();
    }
}
複製代碼
public class Main {
    public static void main(String[] args) {
        //構建器
        Builder builder = new MacbookBuilder();
        //Director
        Director pcDirector = new Director(builder);
        //封裝構建過程,4核、內存2GB、Mac系統
        pcDirector.construct("英特爾主板","Retina顯示器");
        //構建計算機,輸出相關信息
        System.out.println("Computer Info:" + builder.create().toString());
    }
}
複製代碼

運行結果以下:ui

Computer Info:Computer{mBoard='英特爾主板', mDisplay='Retina顯示器', mOS='Mac OS X 10.10'}
複製代碼

上述示例中,經過具體的MacBookBuilder來構建MacBook對象,而Director封裝了構建複雜產品對象的過程,對外隱藏構建細節。Builder與Director一塊兒將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的對象。this

在現實開發過程當中,Director角色常常會被省略。而直接使用一個Builder來進行對象的組裝,這個Builder一般爲鏈式調用,其關鍵點是每一個setter方法都返回自身,也就是return this,這樣就使得setter方法能夠鏈式調用。這種形式不只去除了Director角色,整個結構也更加簡單,也能對Product對象的組裝過程有更精細的控制。spa

3、總結

Builder模式在Android開發中較爲經常使用,一般做爲配置類的構建器將配置的構建和表示分離開來,同時也是將配置從目標類中隔離出來,避免過多的setter方法。Builder模式比較常見的實現形式是經過調用鏈實現,這樣使得代碼更簡潔、易懂。操作系統

3.一、優勢

  1. 良好的封裝性,使用建造者模式可使客戶端沒必要知道產品內部組成的細節。
  2. 建造者獨立,容易擴展。

3.二、缺點

  1. 會產生多餘的Builder對象以及Director對象,消耗內存。

學海無涯苦做舟

個人微信公衆號
相關文章
相關標籤/搜索