1. 程式人生 > >設計模式(二)—— 工廠方法

設計模式(二)—— 工廠方法

源碼下載 工廠方法模式 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();
}

程序輸出

技術分享圖片

優缺點

  • 優點
  1. 客戶端只需要關心所需產品對應的工廠,無須關心產品創建的細節,甚至無須知道具體產品類的類名。
  2. 在系統中加入新產品時,無須修改已經完成的類,只要添加具體的產品和工廠就可以了。
  • 缺點
  1. 添加新產品時,不僅需要添加具體的產品類,還要提供與之對應的具體工廠類,系統中類的數量成對增長,在一定程度上增加了系統的復雜度。

適用場景

  • 當一個類不知道它所必須創建的對象的類的時候
  • 當一個類希望由它的子類來指定它所創建的對象的時候
  • 當類將創建對象的職責委托給多個幫助子類中的某一個,並且希望將哪一個幫助子類時代理者這一信息局部化的時候

源碼下載

dotnet-design-pattern_factorymethod

設計模式(二)—— 工廠方法