1. 程式人生 > >Java設計模式--建造者模式

Java設計模式--建造者模式

建造者模式【Builder Pattern 】
在模板方法模式時用到了公司生產馬車的例子。這裡繼續,客戶有了新的要求,就是能夠控制基本方法的執行順序。
先看一下類圖:

這裡寫圖片描述

定義一個車輛模型的抽象類,所有的車輛模型都繼承這個類

public abstract class CarModel {
    //這個引數是各個基本方法執行的順序
    private ArrayList<String> sequence = new ArrayList<String>();
    /*
    * 模型是啟動開始跑了
    */
    protected abstract void
start(); //能發動,那還要能停下來,那才是真本事 protected abstract void stop(); //喇叭會出聲音,是滴滴叫,還是嗶嗶叫 protected abstract void alarm(); //引擎會轟隆隆的響,不響那是假的 protected abstract void engineBoom(); //那模型應該會跑吧,別管是人推的,還是電力驅動,總之要會跑 final public void run() { //迴圈一遍,誰在前,就先執行誰 for(int i=0;i<this.sequence.size();i++){ String actionName = this
.sequence.get(i); if(actionName.equalsIgnoreCase("start")){ //如果是start關鍵字, this.start(); //開啟汽車 }else if(actionName.equalsIgnoreCase("stop")){ //如果是stop關鍵字 this.stop(); //停止汽車 }else if(actionName.equalsIgnoreCase("alarm")){ //如果是alarm關鍵字 this.alarm(); //喇叭開始叫了 }else
if(actionName.equalsIgnoreCase("engine boom")){ //如果是engine boom關鍵字 this.engineBoom(); //引擎開始轟鳴 } } //把傳遞過來的值傳遞到類內 final public void setSequence(ArrayList<String> sequence){ this.sequence = sequence; } }

然後定義要生產的賓士、寶馬類。

最後在主類設定執行的順序,進行呼叫:

    BenzModel benz = new BenzModel();
    ArrayList<String> sequence = new ArrayList<String>(); //存放run的順序
    sequence.add("engine boom"); //客戶要求,run的時候時候先發動引擎
    sequence.add("start"); //啟動起來
    sequence.add("stop"); //開了一段就停下來
    //然後我們把這個順序給賓士車:
    benz.setSequence(sequence);
    benz.run();

其中 setSequence 方法是允許客戶自己設定一個順序,是要先跑起來在有引擎聲音還是先有引擎聲音再跑起來,還是說那個喇叭就不要響,對於一個具體的模型永遠都固定的。這樣的設計體現不出程式的擴充套件性。

接下來客戶可能提各種各種的需求,不同種類的車型可以有不同的執行順序,有的可以不執行。於是乎,先看一下下面的類圖設計:
這裡寫圖片描述

增加了一個 CarBuilder 的抽象類,以及兩個實現類,其目的是你要什麼排列順序的車,我就給你什麼順序的車,那我們先看 CarBuilder的定義:

public abstract class CarBuilder {
    //建造一個模型,你要給我一個順序要,就是組裝順序
    public abstract void setSequence(ArrayList<String> sequence);
    //設定完畢順序後,就可以直接拿到這個車輛模型

    public abstract CarModel getCarModel();
}

實現類可以定義如下:

public class BenzBuilder extends CarBuilder {
    private BenzModel benz = new BenzModel();

    public CarModel getCarModel() {
    return this.benz;
    }

    public void setSequence(ArrayList<String> sequence) {
    this.benz.setSequence(sequence);
    }
}

在主類中進行呼叫:

    ArrayList<String> sequence = new ArrayList<String>(); //存放run的順序
    sequence.add("engine boom"); //客戶要求,run的時候時候先發動引擎
    sequence.add("start"); //啟動起來
    sequence.add("stop"); //開了一段就停下來
    //要一個賓士車:
    BenzBuilder benzBuilder = new BenzBuilder();
    //把順序給這個builder類,製造出這樣一個車出來
    benzBuilder.setSequence(sequence);
    //製造出一個賓士車
    BenzModel benz = (BenzModel)benzBuilder.getCarModel();
    //賓士車跑一下看看
    benz.run();

這樣便可以針對不同的車子的不同需求進行不同的設計建造。

但是如果要有不同的組合呢?類似於有一個導演指揮這演員的演出順序等。那我們設計一個導演類來擴充套件一下。先看類圖:

這裡寫圖片描述

增加了Director類:程式碼實現

public class Director {
    private ArrayList<String> sequence = new ArrayList();
    private BenzBuilder benzBuilder = new BenzBuilder();
    private BMWBuilder bmwBuilder = new BMWBuilder();
/*
* A型別的賓士車模型,先start,然後stop,其他什麼引擎了,喇叭一概沒有
*/
public BenzModel getABenzModel(){
    //清理場景,這裡是一些初級程式設計師不注意的地方
    this.sequence.clear();
    //這隻ABenzModel的執行順序
    this.sequence.add("start");
    this.sequence.add("stop");
    //按照順序返回一個賓士車
    this.benzBuilder.setSequence(this.sequence);
    return (BenzModel)this.benzBuilder.getCarModel();
    }
    /*
    * B型號的賓士車模型,是先發動引擎,然後啟動,然後停止,沒有喇叭
    */
    public BenzModel getBBenzModel(){
    this.sequence.clear();
    this.sequence.add("engine boom");
    this.sequence.add("start");
    this.sequence.add("stop");
    this.benzBuilder.setSequence(this.sequence);
    return (BenzModel)this.benzBuilder.getCarModel();
    }
    ...
}

在這個導演類中就可以任意的指派方法的執行順序了

於是,在Client方法中呼叫只需如下:

public class Client {
    public static void main(String[] args) {
        Director director = new Director();
        //1W輛A型別的賓士車
        for(int i=0;i<10000;i++){
        director.getABenzModel().run();
        }
        //100W輛B型別的賓士車
        for(int i=0;i<1000000;i++){
        director.getBBenzModel().run();
        }
        //1000W量C型別的寶馬車
        for(int i=0;i<10000000;i++){
        director.getCBMWModel().run();
        }
    }
}

對該案例的總結:
(1)CarModel 以及兩個實現類 BenzModel 和 BMWModel 叫做產品類(Product Class),這個產品類實現了模板方法模式,也就是有模板方法和基本方法。
(2)CarBuilder 以及兩個實現類 BenzBuilder 和 BMWBuilder 叫做建造者(Builder Class)。
(3)Director 類叫做導演類(Director Class),負責安排已有模組的順序,然後告訴 Builder 開始建造
這就已經實現了建造者模式了。

總結:

四個要素
產品類:一般是一個較為複雜的物件,也就是說建立物件的過程比較複雜,一般會有比較多的程式碼量。在本類圖中,產品類是一個具體的類,而非抽象類。實際程式設計中,產品類可以是由一個抽象類與它的不同實現組成,也可以是由多個抽象類與他們的實現組成。
抽象建造者:引入抽象建造者的目的,是為了將建造的具體過程交與它的子類來實現。這樣更容易擴充套件。一般至少會有兩個抽象方法,一個用來建造產品,一個是用來返回產品。
建造者:實現抽象類的所有未實現的方法,具體來說一般是兩項任務:組建產品;返回組建好的產品。
導演類:負責呼叫適當的建造者來組建產品,導演類一般不與產品類發生依賴關係,與導演類直接互動的是建造者類。一般來說,導演類被用來封裝程式中易變的部分。

注意與工廠設計模式的區別
工廠設計模式側重於生產的過程,即物件的建立,而建造者模式側重的是通過不同的執行順序,讓產品類中的呼叫順序不同產生了不同的效能。

使用建造者模式的好處:
1.使用建造者模式可以使客戶端不必知道產品內部組成的細節。
2.具體的建造者類之間是相互獨立的,對系統的擴充套件非常有利。
3.由於具體的建造者是獨立的,因此可以對建造過程逐步細化,而不對其他的模組產生任何影響。

使用建造模式的場合:

1.建立一些複雜的物件時,這些物件的內部組成構件間的建造順序是穩定的,但是物件的內部組成構件面臨著複雜的變化。
2.要建立的複雜物件的演算法,獨立於該物件的組成部分,也獨立於組成部分的裝配方法時。

相關推薦

java設計模式——建造模式

一. 定義與型別 定義:將一個複雜物件的構建與它的表示分離,使用同樣的構建過程可以建立不同的表示 使用者只需制定需要建造的型別就可以得到它們,建造過程以及細節不需要知道 型別:建立型 建造者模式與工廠模式比較相近,它們的區別在於, 建造者模式注重方法的呼叫順序,工廠模式注重建立產品 它們的建立力度

java設計模式----建造模式

目錄   1.什麼是建造者模式   2.建造者模式的簡單實現(造飛機為例)   3.建造者模式使用場景 一、什麼是建造者模式   建造者模式它分離物件子元件的單獨構造和裝配。從而可以構造出複雜的物件。   由於實現了構造和裝配的解耦。不同的構造器,相同的裝配,可以構建出不同的物件。相同的構建器,不

設計模式-建造模式java程式碼案例)

建造者模式 定義 將一個複雜物件的構建與表示分離,使得同樣的構建過程可以建立不同的表示。 結構 抽象建造者類(builder):為建立product物件而指定各個元件的抽象介面 具體建造類(concreteBuilder):實現builder介面,重寫方法構建不同的

Java常用設計模式————建造模式

引言 建造者模式(Builder Pattern)使用多個簡單物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建造型模式,它提供了一種建立物件的最佳方式。 一個Builder會一步步構建最終的物件。該Builder類是獨立於其他物件的。 實現概要 建造者模式的

Java 設計模式——建造模式(Builder Pattern)

  前言 一、簡介 ​二、實現方式 三、常見第一種方式 (1)一般有以下幾個角色 (2)舉個例子 (3)具體步驟 (4)具體程式碼 三、第二種方式 (1)主要有三個角色:抽象建造者、具體建造者、產品 (2)舉個例子 (3)具體步驟

淺談Java設計模式——建造模式(Builder)

一、概述         將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。         建造者模式將複雜產品的構建過程封裝分解在不同的方法中,使得建立過程非常清晰,能夠讓我們更加精確的控制複雜產品物件的建立過程,同時它隔離了複雜產品物件的建立

3.java設計模式-建造模式

Java設計模式-建造者模式 在《JAVA與模式》一書中開頭是這樣描述建造(Builder)模式的:   建造模式是物件的建立模式。建造模式可以將一個產品的內部表象(internal representation)與產品的生產過程分割開來,從而可以使一個建造過程生成具有不同的內部表象的產品物件。

java設計模式-----建造模式

建造者模式 定義 : 將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示.也就是說使用者不需要知道一個複雜的物件時如何建立的.使用者只需要知道使用構造不同物件的方法(Director)就能得到一個完整的複雜物件的例項 建造者模式通常包

Java設計模式】:建立型模式建造模式

1.建造者模式定義 建造者模式,顧名思義的就是類似建房子,有一個固定的流程。在大話設計模式中,作者舉了一個例子大概意思是同一道菜在中國的每一個地方都有不同的味道(LZ印象最深的是酸菜魚,來杭州之後印象最深刻的是清蒸鱸魚。),而肯德基的雞腿、漢堡在每一個城市都是一樣的味道。建造者模式實

java設計模式——建造模式(對建構函式的優化)

我不打算跳入設計模式的過多細節中,因為已經有一大堆的文章和書籍很詳細的解釋過了。所以我打算告訴你為什麼和什麼時候你應該考慮使用設計模式。然而,值得一提的是本文中的模式和四人幫的《Design Patterns: Elements of Reusable Obje

Java設計模式, 單例模式,工廠模式,建造模式和觀察模式

  1、單例模式            寫法:    懶漢式                 /**     * 懶漢模式     * 宣告一個靜態物件,並且在第一次呼叫getInstance 方法時進行初始化     * Created by Bill on 2017/12

JAVA 23種設計設計模式---建造模式

建造者模式跟之前的模式一樣   要抓住以下幾點,在使用時就會有了構建思路。 程式碼結構及介紹: 電腦: package com.zxf.builder; /**  * 假設一臺電腦由 主機板、硬碟、CPU組成  * @author Ad

Java設計模式--建造模式

建造者模式【Builder Pattern 】 在模板方法模式時用到了公司生產馬車的例子。這裡繼續,客戶有了新的要求,就是能夠控制基本方法的執行順序。 先看一下類圖: 定義一個車輛模型的抽象類,所有的車輛模型都繼承這個類 public abstrac

Java設計模式建造模式

建造者模式:       將一個複雜的物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的物件。   建造者模式表示是將複雜的內部建立封裝在內部,對於外部呼叫的人來說,只需要傳入建造者和建造工具,

android使用Java設計模式建造模式(Builder模式)的寫法:

建造者模式的定義 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 這裡給大家分析一下: 定義的前半句說,構造與表示分離,其實就是繼承(或實現)。 兩種工廠模式也都是為某個物件提供一個介面,而且無需指定它們的具體類。

設計模式簡單介紹(java語言)-- 建造模式

設計模式簡單介紹(java語言)– 建造者模式 1. 建造者模式的定義 建造者模式也叫做生成器模式,其定義如下: 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。 通用類圖: 在建造者模中,通常有如下4個角色:

java設計模式——建造模式(Builder)

相對於抽象工廠模式有了一定優勢,抽象工廠模式只能建立儲存單一類的例項,而建造者模式能儲存多個類的例項了。上程式碼,pass:前幾篇都用First、Second啥的,沒法混了,現在換成人了(*^__^*

設計模式-建造模式(05)

部分 目標 bstr 好的 細節 get 邏輯 str ext 定義   建造者模式(Builder Pattern)也叫做生成器模式。英文原話是:Separate the construction of a complex object from its represe

設計模式建造模式

face 組合 print rac 快餐 span system app 如何解決 建造者模式(Builder Pattern)使用多個簡單的對象一步一步構建成一個復雜的對象。 意圖:將一個復雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。 主要解決:主要

設計模式——建造模式

組成 this 步驟 ring 相同 共同點 之間 優點 基礎 什麽是建造者 建造者模式實際上是常用的設計模式。顧名思義,builder的意思是建造者或者建築工人,談到建造自然會想到樓房。樓房是千差萬別的,樓房的外形、層數、內部房間的數量、房間的裝飾等等都不一樣,但是對於