C#設計模式之:工廠方法模式
阿新 • • 發佈:2019-02-06
工廠方法模式(Factory Method):
定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類
回顧之前簡單工廠
簡單工廠的核心程式碼
class OperationFactory
{
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;
}
}
將其改成工廠方法模式
工廠模式程式碼
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA { get => _numberA; set => _numberA = value; }
public double NumberB { get => _numberB; set => _numberB = value; }
public virtual double GetResult ()
{
double result = 0;
return result;
}
}
class OperationAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
class OperationSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
OperationMul 類似,略
OperationDiv 類似,略
interface IFactory
{
Operation CreateOperation();
}
class AddFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();
}
}
class SubFactory : IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
MulFactory 類似,略
DivFactory 類似,略
// test
IFactory operFactory = new AddFactory();// 如果想要更換為減法,則只要new SubFactory(),其它都不會修改
Operation oper = operFactory.CreateOperation();
oper.NumberA = 1;
oper.NumberB = 2;
double result = oper.GetResult();
Console.WriteLine("結果為: " + result);
// result
結果為: 3
兩者對比
簡單工廠
的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態例項化相應的類
,對於客戶端來說,去除了具體產品的依賴
。
但在簡單工廠
裡,如果想要加入新的演算法運算,則需要修改其switch
,違反了設計原則的開閉原則
,也就是說對擴充套件開放了,對修改也開放了(而不是封閉)。
從簡單工廠到工廠方法的演化
因為簡單工廠類與 選擇分支 耦合,所以想解耦的話,可以根據依賴倒置原則(根據介面而不是實現程式設計)
來實現。
簡單工廠 抽象為 工廠介面 及 多個具體生成物件的工廠,這樣整個工廠和產品體系其實都沒有修改的變化,只有擴充套件的變化,這完全符合 開放-封閉 原則
。
工廠方法的本質
工廠方法把簡單的內部邏輯判斷轉移到了客戶端程式碼中去了,想加新功能時,本來是修改工廠的,但現在是在修改客戶端。
工廠方法模式克服了簡單工廠違背的開放-封閉原則的缺點,又保持了封裝物件建立過程的優點。
工廠方法模式是簡單工廠模式的進一步抽象和推廣。
缺點:每增加一個產品,就需要增加一個產品工廠的類,增加了額外的開發量。
避免修改客戶端程式碼的,利用“反射”可以解決避免分支判斷的問題