1. 程式人生 > 實用技巧 >設計模式學習筆記(四):簡單工廠模式

設計模式學習筆記(四):簡單工廠模式

1 定義

簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據引數的不同返回不同類的例項,被建立的例項通常都具有共同的父類。

因為在簡單工廠模式用於建立例項的方法是靜態的方法,因此簡單工廠模式又被稱為靜態工廠方法模式,它屬於類建立型模式。

儘管簡單工廠模式不屬於GoF23種設計模式之一,但是實際中用途廣泛,並且可以作為學習“工廠方法模式”以及“抽象工廠模式”的基礎。

2 結構

由圖可知包含以下三個角色:

  • Factory(工廠角色):即工廠類,負責實現建立所有產品例項的內部邏輯,工廠類可以被外界直接呼叫,建立所需要的產品物件,在工廠類中提供了一個靜態工廠方法用於獲取產品
  • Product(抽象產品角色):是工廠類所建立的所有物件的父類,封裝了各種產品物件的公有方法。Product會提高系統的靈活性,使得在工廠類只需要定義一個通用的工廠產品方法,因為所有建立的具體產品都是其子類物件
  • ConcreteProduct(具體產品角色):所有被建立的物件都充當這個角色的某個具體類的例項。每一個具體產品角色都繼承了抽象產品角色,需要實現在抽象產品中宣告的抽象方法

3 例項

某公司需要開發一個圖表庫,該圖表庫可以提供各種不同外觀的圖表,例如柱狀圖,折線圖等等。

首先可以先設計一個抽象圖表類(這裡是一個介面):

interface Chart
{
	void display();
}

接著各種具體產品類(柱狀圖,折線圖,餅狀圖等)實現該介面即可:

class HistogramChart implements Chart
{
    public HistogramChart()
    {
        System.out.println("建立柱狀圖");
    }

    public void display()
    {
        System.out.println("顯示柱狀圖");
    }
}

class PieChart implements Chart
{
    public PieChart()
    {
        System.out.println("建立餅狀圖");
    }

    public void display()
    {
        System.out.println("顯示餅狀圖");
    }
}

class LineChart implements Chart
{
    public LineChart()
    {
        System.out.println("建立折線圖");
    }

    public void display()
    {
        System.out.println("顯示折線圖");
    }
}

最後是工廠類,為了方便加上了列舉引數:

class Factory
{
    public static Chart getChart(Charts charts)
    {
        switch(charts)
        {
            case PIE_CHART:
                return new PieChart();
            case LINE_CHART:
                return new LineChart();
            case HISTOGRAM_CHART:
                return new HistogramChart();
            default:
                return null;
        }
    }
}

enum Charts
{
    PIE_CHART,LINE_CHART,HISTOGRAM_CHART;
}

測試:

public static void main(String[] args) {
    Chart chart = Factory.getChart(Charts.LINE_CHART);
    chart.display();
}

4 簡化

為了簡化簡單工廠模式,可以將抽象產品類與工廠類合併,將靜態方法移至抽象產品類中:

這樣可以通過抽象產品類的靜態方法獲取子類物件,優化程式碼如下:

interface Chart
{
    void display();
    static Chart getChart(Charts charts)
    {
        switch(charts)
        {
            case PIE_CHART:
                return new PieChart();
            case LINE_CHART:
                return new LineChart();
            case HISTOGRAM_CHART:
                return new HistogramChart();
            default:
                return null;
        }
    }
}

5 主要優點

簡單工廠模式的主要優點如下:

  • 分離職責:簡單工廠模式實現了物件建立以及使用的分離,工廠類包含必要的判斷邏輯,可以決定在什麼時候建立什麼哪一個產品的例項,客戶端可以免除直接建立產品物件的職責,僅僅是“消費”產品
  • 簡化記憶:客戶端無須知道具體產品類的名字,只需要知道對應的引數即可,一般使用常量字串或者列舉
  • 提高靈活性:可以引入配置檔案(xml等)在不修改客戶端程式碼情況下增加新的具體產品類,提高靈活性

6 主要缺點

簡單工廠模式的主要缺點如下:

  • 工廠類集中了所有產品的建立邏輯,一旦不能正常工作,整個系統都要受影響
  • 由於引入了工廠類會增加系統中類的個數,會增加系統的複雜度和理解難度
  • 系統擴充套件困難,一旦新增新產品就不得不修改工廠邏輯,在產品型別過多時,有可能造成工廠邏輯過於複雜,不利於系統的擴充套件和維護
  • 簡單工廠模式使用了靜態工廠方法,造成工廠角色無法基於繼承的等級結構

7 適用場景

  • 工廠類負責建立的物件比較少,由於建立物件較少,不會造成工廠方法中的業務邏輯太過複雜
  • 客戶端只需要知道傳入工廠類的引數,對如何建立物件不關心

8 總結