前言
工廠方法模式:定義一個用於創建對象的接口,讓子類決定實例化那一個類。工廠方法使一個類的實例化延遲到其子類。
簡單工廠模式(http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html)的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式實現時,客戶端需要決定實例化那一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移動到了客戶端代碼來進行。你想要加功能,本來是改工廠類的(簡單工廠模式),而現在是修改客戶端。
工廠方法UML類圖
如果想加一個功能,比如M的N次方,只需要增加此功能的運算類和相應的工廠類就可以了。
代碼實現
1.第一步寫好運算類:
///Operation運算類 public class Operation { public double NumberA { get; set; } public double NumberB { get; set; } public virtual double GetResult() { double result = 0; return result; } }
2.那么接下來就需要實現加減乘除運算類
/// <summary> /// 加法運算類 /// </summary> public class OperationAdd : Operation { public override double GetResult() { double result = 0; result = this.NumberA + this.NumberB; return result; } } ///減法運算類 public class OperationSub : Operation { public override double GetResult() { double result = 0; result = this.NumberA - this.NumberB; return result; } } /// <summary> /// 乘法運算類 /// </summary> public class OperationMul : Operation { public override double GetResult() { double result = 0; result = this.NumberA * this.NumberB; return result; } } /// <summary> /// 除法運算類 /// </summary> public class OperationDiv : Operation { public override double GetResult() { double result = 0; if (this.NumberB == 0) { throw new Exception("除數不能為0。"); } result = this.NumberA / this.NumberB; return result; } }
第三步寫好抽象工廠
///抽象工廠 工廠接口 public interface IFactory { Operation CreateOperation(); }
工廠接口返回的就是運算類
第四步實現加減乘除抽象工廠
/// <summary> /// 加法工廠類 /// </summary> public class AddFactory : IFactory { public Operation CreateOperation() { return new OperationAdd(); } } /// <summary> /// 減法工廠類 /// </summary> public class SubFactory : IFactory { public Operation CreateOperation() { return new OperationSub(); } } /// <summary> /// 乘法工廠類 /// </summary> public class MulFactory : IFactory { public Operation CreateOperation() { return new OperationMul(); } } /// <summary> /// 除法工廠類 /// </summary> public class DivFactory : IFactory { public Operation CreateOperation() { return new OperationDiv(); } }
第五步進行調用一個加法的示例
class Program { static void Main(string[] args) { ////調用加法的示例 IFactory OperationFactory = new AddFactory(); Operation Oper = OperationFactory.CreateOperation(); Console.WriteLine("輸入第一個數字:A"); Oper.NumberA = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("輸入第二個數字:B"); Oper.NumberB = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(Oper.GetResult()); Console.ReadLine(); } }
運行后結果為
總結
工廠方法模式克服了簡單工廠違背開放-封閉原則的缺點,有保持了封裝對象創建過程的優點。工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。但缺點是由於每加一個產品,就需要加一個產品工廠的類,增加了額外的開發量。當然還有更好的方案……
如果您對上節的簡單工廠模式還不太了解可以看一下http://www.cnblogs.com/aehyok/archive/2013/05/10/3072008.html