概述
一個水果農場,用戶需要某一種水果時,農場能夠根據用戶所提供的水果名稱返回該水果。在此,水果農場被稱爲工廠(Factory),而生產出的水果被稱爲產品,水果的名稱被稱爲參數,工廠可以根據參數的不同返回不同的產品,這就是簡單工廠的動機。
簡單工廠模式:定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。
使用頻率:★★★☆☆
結構與實現
簡單工廠模式包含以下3個角色:
- Factory(工廠角色)
- Product (抽象產品角色)
- 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();
}
在實現上,也可以將Fruit
和FruitFactory
合併,將GetFruit
方法移動到Fruit
中以簡化此模式。
優缺點
優點:
- 簡單工廠模式實現了對象創建和使用的分離。
- 客戶端無需知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可。
- 通過引入配置文件,可以在不修改任何客戶端代碼的情況下,更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
缺點:
- 由於工廠類集中了所有產品的創建邏輯,職責過重,一旦不能正常工作,整個系統都要受到影響。
- 使用簡單工廠模式勢必會增加系統中類的個數(引入了新的工廠類),增加了系統的複雜度和理解難度。
- 系統擴展困難,一旦添加新產品不得不修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
- 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法新城基於繼承的等級結構。在C#語言中,不能通過類的實例化對象來訪問靜態方法和靜態變量,無法在客戶端代碼中針對父類編程,而在運行時使用工廠子類對象來覆蓋父類,因此,工廠類不能得到很好的擴展。
適用場景
- 工廠類負責創建的對象較少時
- 客戶端只知道傳入工廠類的參數,不關心如何創建對象