1. 程式人生 > >設計模式(一)—— 簡單工廠

設計模式(一)—— 簡單工廠

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

運行結果:

技術分享圖片

優缺點

  • 優點:
  1. 客戶端不必關心對象如何創建以及如何組織,由工廠類決定應該創建哪個具體類的對象。
  2. 明確區分了各自的職責和權力,有利於整個軟件體系結構的優化。
  • 缺點:
  1. 工廠類集中了所有實例的創建邏輯,當產品不斷增加,工廠類根據不同條件創建不同實例時,容易出現混亂,不利於系統的維護和擴展。
  2. 如果增加新的產品,工廠類也需要做出相應的修改,違反了開放封閉原則

適用場景

  • 工廠類負責創建的對象較少
  • 客戶端只知道傳入工廠的參數,對於如何創建對象(邏輯)不關心

示例代碼下載

dotnet-design-pattern_simplefactory

設計模式(一)—— 簡單工廠