C#設計模式之簡單工廠模式(Simple Factory Pattern)
簡單工廠模式解釋:
簡單工廠模式(Simple Factory Pattern)屬於類的創新型模式,又叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。
模式型別: 創造類模式。
目的:
解耦,用工廠模式代替new
類()可以避免硬編碼耦合。
簡單工廠模式中包含的角色及其相應的職責如下:
工廠角色(Creator):這是簡單工廠模式的核心,由它負責建立所有的類的內部邏輯。當然工廠類必須能夠被外界呼叫,建立所需要的產品物件。
抽象(Product)產品角色
具體產品(Concrete Product)角色:簡單工廠所建立的具體例項物件,這些具體的產品往往都擁有共同的父類。
UML圖:
程式碼實現:
以下用一個爛大街的 "計算器" 專案演示.
1.建立基類(即: 抽):Operation
2.分別建立"加,減,乘,除"的子類(即: 具體產品角色): OperationAdd,OperationSub,OperationMul,OperationDivpublic 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; } }
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替換原則實現最佳的、正確的繼承層次,就能保證不會違反開放封閉原則。