C#設計模式[1] - 簡單工廠模式

🚀24個C#設計模式目錄    🍺源碼地址

概述

一個水果農場,用戶需要某一種水果時,農場能夠根據用戶所提供的水果名稱返回該水果。在此,水果農場被稱爲工廠(Factory),而生產出的水果被稱爲產品,水果的名稱被稱爲參數,工廠可以根據參數的不同返回不同的產品,這就是簡單工廠的動機。

簡單工廠模式:定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。

使用頻率:★★★☆☆

結構與實現

簡單工廠模式包含以下3個角色:

  1. Factory(工廠角色)
  2. Product (抽象產品角色)
  3. ConcreteProduct (具體產品角色)

這裏仍然使用開頭的例子,水果農場(FruitFactory)作爲工廠角色,水果(Fruit)爲抽象產品角色,蘋果和橘子作爲具體產品角色,由此可以得出模式結構:

在這裏插入圖片描述

工廠角色是這個簡單工廠模式的核心,他需要提供靜態的工廠方法,來根據參數返回實例化對象。抽象產品角色封裝了各個產品的公共方法,其具體產品角色間不同的方法由各自子類實現。

abstract class Fruit
{
    // 所有產品類的公共業務方法
    public void MethodSame()
    {
        Console.WriteLine("Same method for all fruit");
    }
    // 聲明抽象業務方法
    public abstract void MethodDiff();
}

🍎Apple和🍊Orange繼承Fruit並重載MethodDiff()

class Apple : Fruit
{
    public override void MethodDiff()
    {
        Console.WriteLine("Different method for Apple");
    }
}
class Orange : Fruit
{
    public override void MethodDiff()
    {
        Console.WriteLine("Different method for Orange");
    }
}

FruitFactory提供靜態方法根據參數返回不同實例。

class FruitFactory
{
    public static Fruit GetFruit(string arg)
    {
        Fruit fruit = null;
        if (arg == "Apple")
        {
            fruit = new Apple();
        } 
        else if (arg == "Orange")
        {
            fruit = new Orange();
        }
        return fruit;
    }
}

客戶端調用方法如下:

static void Main(string[] args)
{
    Fruit fruit= FruitFactory.GetFruit("Apple");
    fruit.MethodSame();
    fruit.MethodDiff();
}

在實現上,也可以將FruitFruitFactory合併,將GetFruit方法移動到Fruit中以簡化此模式。

優缺點

優點:

  1. 簡單工廠模式實現了對象創建和使用的分離。
  2. 客戶端無需知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可。
  3. 通過引入配置文件,可以在不修改任何客戶端代碼的情況下,更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

缺點:

  1. 由於工廠類集中了所有產品的創建邏輯,職責過重,一旦不能正常工作,整個系統都要受到影響。
  2. 使用簡單工廠模式勢必會增加系統中類的個數(引入了新的工廠類),增加了系統的複雜度和理解難度。
  3. 系統擴展困難,一旦添加新產品不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
  4. 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法新城基於繼承的等級結構。在C#語言中,不能通過類的實例化對象來訪問靜態方法和靜態變量,無法在客戶端代碼中針對父類編程,而在運行時使用工廠子類對象來覆蓋父類,因此,工廠類不能得到很好的擴展。

適用場景

  • 工廠類負責創建的對象較少時
  • 客戶端只知道傳入工廠類的參數,不關心如何創建對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章