工廠三兄弟之簡單工廠模式(一)

工廠三兄弟之簡單工廠模式(一)html

工廠模式是最經常使用的一類建立型設計模式,一般咱們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將要學習的簡單工廠模式是工廠方法模式的「小弟」,它不屬於 GoF 23 種設計模式,但在軟件開發中應用也較爲頻繁,一般將它做爲學習其餘工廠模式的入門。此外,工廠方法模式還有一位「大哥」——抽象工廠模式。這三種工廠模式各具特點,難度也逐個加大,在軟件開發中它們都獲得了普遍的應用,成爲面向對象軟件中經常使用的建立對象的工具。設計模式

圖表庫的設計
Sunny 軟件公司欲基於 Java 語言開發一套圖表庫,該圖表庫能夠爲應用系統提供各類不一樣外觀的圖表,例如柱狀圖、餅狀圖、折線圖等。Sunny 軟件公司圖表庫設計人員但願爲應用系統開發人員提供一套靈活易用的圖表庫,並且能夠較爲方便地對圖表庫進行擴展,以便可以在未來增長一些新類型的圖表。框架

Sunny 軟件公司圖表庫設計人員提出了一個初始設計方案,將全部圖表的實現代碼封裝在一個 Chart 類中,其框架代碼以下所示:函數

class Chart {
    private String type; //圖表類型

    public Chart(Object[][] data, String type) {
        this.type = type;
        if (type.equalsIgnoreCase("histogram")) {
            //初始化柱狀圖
        }
        else if (type.equalsIgnoreCase("pie")) {
            //初始化餅狀圖
        }
        else if (type.equalsIgnoreCase("line")) {
            //初始化折線圖
        }
    }

    public void display() {
        if (this.type.equalsIgnoreCase("histogram")) {
            //顯示柱狀圖
        }
        else if (this.type.equalsIgnoreCase("pie")) {
            //顯示餅狀圖
        }
        else if (this.type.equalsIgnoreCase("line")) {
            //顯示折線圖
        }   
    }
}

客戶端代碼經過調用 Chart 類的構造函數來建立圖表對象,根據參數 type 的不一樣能夠獲得不一樣類型的圖表,而後再調用 display() 方法來顯示相應的圖表。工具

不難看出,Chart 類是一個「巨大的」類,在該類的設計中存在以下幾個問題:性能

(1) 在 Chart 類中包含不少 if…else… 代碼塊,整個類的代碼至關冗長,代碼越長,閱讀難度、維護難度和測試難度也越大;並且大量條件語句的存在還將影響系統的性能,程序在執行過程當中須要作大量的條件判斷。學習

(2) Chart 類的職責太重,它負責初始化和顯示全部的圖表對象,將各類圖表對象的初始化代碼和顯示代碼集中在一個類中實現,違反了「單一職責原則」,不利於類的重用和維護;並且將大量的對象初始化代碼都寫在構造函數中將致使構造函數很是龐大,對象在建立時須要進行條件判斷,下降了對象建立的效率。測試

(3) 當須要增長新類型的圖表時,必須修改 Chart 類的源代碼,違反了「開閉原則」。this

(4) 客戶端只能經過 new 關鍵字來直接建立 Chart 對象,Chart 類與客戶端類耦合度較高,對象的建立和使用沒法分離。設計

(5) 客戶端在建立 Chart 對象以前可能還須要進行大量初始化設置,例如設置柱狀圖的顏色、高度等,若是在 Chart 類的構造函數中沒有提供一個默認設置,那就只能由客戶端來完成初始設置,這些代碼在每次建立 Chart 對象時都會出現,致使代碼的重複。

面對一個如此巨大、職責如此重,且與客戶端代碼耦合度很是高的類,咱們應該怎麼辦?本章將要介紹的簡單工廠模式將在必定程度上解決上述問題。

更多設計模式:http://wiki.jikexueyuan.com/project/design-pattern-creation/simple-two.html

相關文章
相關標籤/搜索