設計模式學習筆記(四):簡單工廠模式
阿新 • • 發佈:2020-07-13
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 適用場景
- 工廠類負責建立的物件比較少,由於建立物件較少,不會造成工廠方法中的業務邏輯太過複雜
- 客戶端只需要知道傳入工廠類的引數,對如何建立物件不關心