Java設計模式之建造者模式

前言

建造者模式也被稱爲生成器模式,它是建立一個複雜對象的建立型模式,它將構建複雜的對象過程和它的部件解耦,使構建過程和部件的表示分離開來。例如咱們本身要 DIY 一臺臺式計算機。咱們找到 DIY 商家,這是咱們要求這臺計算機的 CPU、主板、或者其餘部件都是什麼牌子、什麼配置的,這些部件是能夠根據咱們本身的需求來變化的。咱們只須要提供相關部件的牌子和配置就能夠了。對於這種狀況咱們的能夠採用建造者模式,將部件和組裝過程分離,使得構建過程和部件均可以自由拓展,二者之間的耦合也降到最低。react

定義

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

使用場景

  • 當建立複雜對象的算法應該獨立於該對象的組成部分以及它們的裝配方式時。
  • 相同的方法,不一樣的執行順序,生產不一樣的事件結果時。
  • 多個部件或零件均可以被裝配到一個對象中,可是生產的運行結果又不相同時。
  • 產品類很是複雜,或者產品類中的調用順序不一樣而生產了不一樣的效能時。
  • 須要建立一些複雜對象,這些對象內部組成構件間的建造順序是穩定的,可是對象的內部組成構件面臨複雜的變化時。

角色

  • Director:導演類,負責安排已有模塊的順序,而後通知 Builder 開始建造。
  • Builder:抽象 Builder類,規範產品的組建,通常由子類實現。
  • ConcreteBuilder:具體建造者,實現抽象 Builder 類定義的全部方法,而且返回一個組建好的對象。
  • Product:產品類。

建築者模式的簡單實現

  1. 建立產品類:咱們要組裝一臺計算機,計算機被抽象爲 Computer 類,它有3個部件:CPU、主板和內存,並在裏面提供3個方法分別用來設置 CPU、主板和內存。
public class Computer {
    private String mCpu;
    private String mMainboard;
    private String mRam;

    public void setmCpu(String mCpu) {
        this.mCpu = mCpu;
    }

    public void setmMainboard(String mMainboard) {
        this.mMainboard = mMainboard;
    }

    public void setmRam(String mRam) {
        this.mRam = mRam;
    }
}
複製代碼
  1. 建立Builder類規範產品的建立:商家組裝計算機有一套組裝方法的模版,就是一個抽象的 Builder 類,其裏面提供了安裝 CPU、主板和內存的方法,以及組裝成計算機的 creact 方法。
public abstract class Builder {
    public abstract void buildCpu(String cpu);
    public abstract void buildMainboard(String mainboard);
    public abstract void buildRam(String ram);
    public abstract Computer create();
}
複製代碼
  1. 建立組裝計算機類:商家實現了抽象的 Builder 類,MoonComputerBuilder 類用於組裝計算機。
public class MoonComputerBuilder extends Builder {
    private Computer mComputer = new Computer();
    @Override
    public void buildCpu(String cpu) {
        mComputer.setmCpu(cpu);
    }

    @Override
    public void buildMainboard(String mainboard) {
        mComputer.setmMainboard(mainboard);
    }

    @Override
    public void buildRam(String ram) {
        mComputer.setmRam(ram);
    }

    @Override
    public Computer create() {
        return mComputer;
    }
}
複製代碼
  1. 建立導演類:統一管理組裝過程。商家就是導演類用來規範組裝計算機的流程規範,先安裝主板,在安裝 CPU ,最後安裝內存並組裝完成計算機:
public class Director {
    Builder mBuild = null;
    public Director(Builder build){
        this.mBuild = build;
    }
    public Computer CreateComputer(String cpu, String mainboard, String ram){
        //規範建築流程
        this.mBuild.buildMainboard(mainboard);
        this.mBuild.buildCpu(cpu);
        this.mBuild.buildRam(ram);
        return mBuild.create();
    }
}
複製代碼
  1. 客戶端調用導演類:最後商家用導演類組裝計算機。咱們只須要提供本身想要的 CPU 、主板和內存就能夠了,至於商家怎樣組裝計算機咱們無須知道。
public class CreateComputer {
    public static void main(String[] args){
        Builder mBuilder = new MoonComputerBuilder();
        Director mDirector = new Director(mBuilder);
        //組裝計算機
        mDirector.CreateComputer("i7-6700", "華擎玩家至尊", "三星 DDR4");
    }
}
複製代碼

優缺點

優勢

  • 使用建造者模式可使客戶端沒必要知道產品內部組成的細節。
  • 具體的建造者類之間是相互獨立的,容易擴展。
  • 因爲具體的建造者是獨立的,所以能夠對建造過程逐步細化,而不對其餘的模塊產生任何影響。

缺點

  • 多出 Build 對象以及導演類。
相關文章
相關標籤/搜索