1. 程式人生 > >C#設計模式之簡單工廠模式(Simple Factory Pattern)

C#設計模式之簡單工廠模式(Simple Factory Pattern)

簡單工廠模式解釋: 

       簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

模式型別: 創造類模式

目的: 

       解耦用工廠模式代替new 類()可以避免硬編碼耦合

簡單工廠模式中包含的角色及其相應的職責如下:

工廠角色(Creator):這是簡單工廠模式的核心,由它負責建立所有的類的內部邏輯。當然工廠類必須能夠被外界呼叫,建立所需要的產品物件。

抽象(Product)產品角色

:簡單工廠模式所建立的所有物件的父類,注意,這裡的父類可以是介面也可以是抽象類,它負責描述所有例項所共有的公共介面。

具體產品(Concrete Product)角色:簡單工廠所建立的具體例項物件,這些具體的產品往往都擁有共同的父類。

UML圖:


程式碼實現:

以下用一個爛大街的 "計算器" 專案演示.

1.建立基類(即: 抽):Operation

public class Operation
{
    private double _numberA = 0;
    public double NumberA
    {
        get { return _numberA; }
        set { _numberA = value; }
    }
    private double _numberB = 0;
    public double NumberB
    {
        get { return _numberB; }
        set { _numberB = value; }
    }
    public virtual double GetResult()
    {
        double result = 0;
        return result;
    }
}
2.分別建立"加,減,乘,除"的子類(即: 具體產品角色): OperationAdd,OperationSub,OperationMul,OperationDiv
public class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = base.NumberA + base.NumberB;
        return result;
    }
}
public class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = base.NumberA - base.NumberB;
        return result;
    }
}
public class OperationMul : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = base.NumberA * base.NumberB;
        return result;
    }
}
public class OperationDiv : Operation
{
    public override double GetResult()
    {
        double result = 0;
        if (base.NumberB == 0)
            return 0;
        result = base.NumberA / base.NumberB;
        return result;
    }
}

3.建立工廠類(即:工廠角色): Factory
public class Factory
{
    public static Operation createOperate(string operate)
    {
        Operation oper = null;
        switch (operate)
        {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;
        }
        return oper;
    }
}

4.客戶端(消費者)角色:
public class Client
{
    public void main()
    {
        Operation oper;
        oper = Factory.createOperate("+");
        oper.NumberA = 10;
        oper.NumberB = 20;
        double result = oper.GetResult();
    }
}

簡單工廠模式的優缺點分析: 

優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系結構的優化。

缺點:由於工廠類集中了所有例項的建立邏輯,這就直接導致一旦這個工廠出了問題,所有的客戶端都會受到牽連;而且由於簡單工廠模式的產品室基於一個共同的抽象類或者介面,這樣一來,但產品的種類增加的時候,即有不同的產品介面或者抽象類的時候,工廠類就需要判斷何時建立何種種類的產品,這就和建立何種種類產品的產品相互混淆在了一起,違背了單一職責,導致系統喪失靈活性和可維護性。而且更重要的是,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴充套件開放,對修改關閉”的原則,因為當我新增加一個產品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。

      總結一下:簡單工廠模式分離產品的建立者和消費者,有利於軟體系統結構的優化;但是由於一切邏輯都集中在一個工廠類中,導致了沒有很高的內聚性,同時也違背了“開放封閉原則”。另外,簡單工廠模式的方法一般都是靜態的,而靜態工廠方法是無法讓子類繼承的,因此,簡單工廠模式無法形成基於基類的繼承樹結構。

備註:開放封閉原則(OCP,Open Closed Principle)是所有面向物件原則的核心。軟體設計本身所追求的目標就是封裝變化、降低耦合,而開放封閉原則正是對這一目標的最直接體現。其他的設計原則,很多時候是為實現這一目標服務的,例如以Liskov替換原則實現最佳的、正確的繼承層次,就能保證不會違反開放封閉原則。