設計模式(一)—— 簡單工廠
阿新 • • 發佈:2018-04-19
echart 調用 抽象 簡單工廠模式 客戶端 工廠類 info 工具 crete
簡單工廠
簡介
簡單工廠模式屬於創建型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是一個工廠對象決定創建出哪一種產品類的實例。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。
結構分析
簡單工廠的UML類圖:
該模式包含的角色和職責:
- AbstractProduct
抽象產品。簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
- ConcreteProduct
具體產品。簡單工廠模式的創建目標,所有創建的對象都是充當這個角色的某個具體實例。
- Factory
工廠。簡單工廠模式的核心,負責實現創建所有實例的內部邏輯,工廠類的創建產品類可以被外界直接調用,創建所需的產品對象。
示例
假設我們要開發一款支持多種圖表的工具包,能夠從中獲取折線圖(Line Chart)、柱狀圖(Bar Chart)、餅狀圖(Pie Chart)等,下面我們使用簡單工廠模式來實現該功能。
創建圖表抽象類Chart,包含抽象方法Draw
public abstract class Chart
{
public abstract void Draw();
}
創建具體圖表類LineChart、BarChart、PieChart
public class LineChart : Chart { public override void Draw() { string lineChart = "| \n"; lineChart += "| - \n"; lineChart += "| - \n"; lineChart += "| -- \n"; lineChart += "| -- \n"; lineChart += "| --- \n"; lineChart += "| --- \n"; lineChart += "| - \n"; lineChart += "|______________________________"; Console.WriteLine(lineChart); } } public class BarChart : Chart { public override void Draw() { string barChart = "| \n"; barChart += "| __ \n"; barChart += "| | | __ \n"; barChart += "| __ | | | | \n"; barChart += "| | | | | __ | | \n"; barChart += "| | | | | | | | | \n"; barChart += "| | | | | | | | | \n"; barChart += "|____|__|____|__|____|__|____|__|_____"; Console.WriteLine(barChart); } } public class PieChart : Chart { public override void Draw() { string lineChart = "| \n"; lineChart += "| ------------ \n"; lineChart += "| |***@@@@@@@@@| \n"; lineChart += "| |*****@@@@@@@@@| \n"; lineChart += "| |*******@@@@@@@@@| \n"; lineChart += "| |*********@@@@@@@@@| \n"; lineChart += "| |********$$$$$$$$| \n"; lineChart += "| |******$$$$$$$$| \n"; lineChart += "| |****$$$$$$$$| \n"; lineChart += "| ------------ \n"; lineChart += "|______________________________"; Console.WriteLine(lineChart); } }
最後創建Chart工廠類
public class ChartFactory { public Chart CreateChart(string type) { Chart chart; switch (type) { case "L": chart = new LineChart(); break; case "B": chart = new BarChart(); break; case "P": chart = new PieChart(); break; default: throw new KeyNotFoundException(); } return chart; } }
當然,這裏也可以利用靜態方法創建一個工廠,因為在使用時我們不必再創建工廠對象,直接調用靜態方法來實例化對象。但這也有缺點,即不能通過繼承來改變創建方法的行為。
客戶端調用
static void Main(string[] args)
{
ChartFactory factory = new ChartFactory();
var chart = factory.CreateChart("B");
chart.Draw();
Console.ReadLine();
}
運行結果:
優缺點
- 優點:
- 客戶端不必關心對象如何創建以及如何組織,由工廠類決定應該創建哪個具體類的對象。
- 明確區分了各自的職責和權力,有利於整個軟件體系結構的優化。
- 缺點:
- 工廠類集中了所有實例的創建邏輯,當產品不斷增加,工廠類根據不同條件創建不同實例時,容易出現混亂,不利於系統的維護和擴展。
- 如果增加新的產品,工廠類也需要做出相應的修改,違反了開放封閉原則
適用場景
- 工廠類負責創建的對象較少
- 客戶端只知道傳入工廠的參數,對於如何創建對象(邏輯)不關心
示例代碼下載
dotnet-design-pattern_simplefactory
設計模式(一)—— 簡單工廠