設計模式(二)—— 工廠方法
阿新 • • 發佈:2018-04-24
源碼下載 工廠方法模式 ati \n end 註意 con 流程 pie
工廠方法
模式簡介
工廠方法模式(Factory Method Pattern)又被稱為工廠模式,也叫虛構造器(Virtual Constructor)模式或多態工廠(Polymorphic Factory)模式,它屬於類創建型模式。在工廠方法模式中,工廠父類負責定義一個用於創建產品對象的公共接口,讓子類決定實例化具體的產品對象。使產品類的實例化延遲到工廠子類中。
結構說明
結構圖
角色及職責
- Product
抽象產品類。定義工廠方法所創建的對象的接口。
- ConcreteProduct
具體產品類。實現Product接口,工廠方法的創建目標。
- Factory
抽象工廠類。聲明工廠方法,該方法返回一個Product類型的對象。也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象。
- ConcreteFactory
具體工廠類。重定義工廠方法以返回一個ConcreteProduct實例。
示例分析
仍以上一篇(設計模式(一)—— 簡單工廠)中圖表工具包為例。
考慮一下使用簡單工廠模式的設計有什麽問題?
當我們添加產品(圖表)時,ChartFactory工廠也要做出相應的修改,這就違反了類的開放封閉原則。
使用工廠方法優化該示例
註意兩者的差別
工廠方法模式創建了抽象工廠ChartFactory,分別實現了LineChartFactory、BarChartFactory以及PieChartFactory三個具體子類,並在工廠子類中返回相應的Chart實例。
public abstract class ChartFactory { public abstract Chart CreateChart(); } public class LineChartFactory : ChartFactory { public override Chart CreateChart() { return new LineChart(); } } public class BarChartFactory : ChartFactory { public override Chart CreateChart() { return new BarChart(); } } public class PieChartFactory : ChartFactory { public override Chart CreateChart() { return new PieChart(); } }
這樣,在新增產品(圖表)時,我們便不再需要修改已經完成的類,轉而增加相應的產品及工廠子類即可。例如,現增加流程圖FlowChart。
創建產品類FlowChart
public class FlowChart : Chart { public override void Draw() { string flowChart = "| \n"; flowChart += "| \n"; flowChart += "| ------- \n"; flowChart += "| | START | \n"; flowChart += "| ------- \n"; flowChart += "| | \n"; flowChart += "| ------- \n"; flowChart += "| | ... | \n"; flowChart += "| ------- \n"; flowChart += "| | \n"; flowChart += "| ------- \n"; flowChart += "| | END | \n"; flowChart += "| ------- \n"; flowChart += "| \n"; flowChart += "|______________________________________"; Console.WriteLine(flowChart); } }
創建相應的工廠類FlowChartFactory
public class FlowChartFactory : ChartFactory
{
public override Chart CreateChart()
{
return new FlowChart();
}
}
客戶端調用
static void Main(string[] args)
{
FlowChartFactory factory = new FlowChartFactory();
var flowChart = factory.CreateChart();
flowChart.Draw();
Console.ReadLine();
}
程序輸出
優缺點
- 優點
- 客戶端只需要關心所需產品對應的工廠,無須關心產品創建的細節,甚至無須知道具體產品類的類名。
- 在系統中加入新產品時,無須修改已經完成的類,只要添加具體的產品和工廠就可以了。
- 缺點
- 添加新產品時,不僅需要添加具體的產品類,還要提供與之對應的具體工廠類,系統中類的數量成對增長,在一定程度上增加了系統的復雜度。
適用場景
- 當一個類不知道它所必須創建的對象的類的時候
- 當一個類希望由它的子類來指定它所創建的對象的時候
- 當類將創建對象的職責委托給多個幫助子類中的某一個,並且希望將哪一個幫助子類時代理者這一信息局部化的時候
源碼下載
dotnet-design-pattern_factorymethod
設計模式(二)—— 工廠方法