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

1 定義

簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它能夠根據參數的不一樣返回不一樣類的實例,被建立的實例一般都具備共同的父類。java

由於在簡單工廠模式用於建立實例的方法是靜態的方法,所以簡單工廠模式又被稱爲靜態工廠方法模式,它屬於類建立型模式。設計模式

儘管簡單工廠模式不屬於GoF23種設計模式之一,可是實際中用途普遍,而且能夠做爲學習「工廠方法模式」以及「抽象工廠模式」的基礎。ide

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("顯示折線圖");
    }
}

最後是工廠類,爲了方便加上了枚舉參數:code

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;
}

測試:xml

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 總結

在這裏插入圖片描述

相關文章
相關標籤/搜索