今天來講一下工廠方法模式。 大家可能聽著這個模式有點耳熟,是的,前面第一篇博文,我們講到了簡單工廠模式。嗯,他們有的確非常相似,今天我們就拿簡單工廠模式中的案例舉例子即可。 學會了簡單工廠模式,對於工廠方法模式也就自然而然的會了。 大家知道,簡單工廠有個很明顯的缺點,就案例來說,我增加一種演算法,則需 ...
今天來講一下工廠方法模式。
大家可能聽著這個模式有點耳熟,是的,前面第一篇博文,我們講到了簡單工廠模式。嗯,他們有的確非常相似,今天我們就拿簡單工廠模式中的案例舉例子即可。
學會了簡單工廠模式,對於工廠方法模式也就自然而然的會了。
大家知道,簡單工廠有個很明顯的缺點,就案例來說,我增加一種演算法,則需要增加一個類(這個沒問題,擴展嘛。),但是,我還要修改工廠,在工廠方法類面多加一個case判斷,這其實違背了開放封閉原則的。(儘量不要修改已經寫好的類)。
那麼,我們可以用工廠方法模式來解決這個問題。
我們將案例中的OperationFactory類抽象出一個介面,然後讓每一個case都拆分成繼承這個介面的類。
代碼如下:
1 //工廠的抽象介面 2 interface IFactory 3 { 4 Operation CreateOperation(); 5 } 6 //加法工廠 7 class AddFactory : IFactory 8 { 9 public Operation CreateOperation() 10 { 11 return new OperationAdd(); 12 } 13 } 14 //減法工廠 15 class SubFactory : IFactory 16 { 17 public Operation CreateOperation() 18 { 19 return new OperationSub(); 20 } 21 } 22 //乘法工廠 23 class MulFactory : IFactory 24 { 25 public Operation CreateOperation() 26 { 27 return new OperationMul(); 28 } 29 } 30 //除法工廠 31 class DivFactory : IFactory 32 { 33 public Operation CreateOperation() 34 { 35 return new OperationDiv(); 36 } 37 }
這樣的話,客戶端就改成如下:
1 public static void Main() 2 { 3 Operation oper = new Operation(); 4 AddFactory addfac = new AddFactory(); 5 oper = addfac.CreateOperation(); 6 oper.NumberA = 2; 7 oper.NumberB = 3; 8 var result = oper.GetResult(); 9 Console.WriteLine(result); 10 Console.ReadKey(); 11 }
好,這樣,就將原來的簡單工廠模式改編成工廠方法模式了。
下麵我們看看工廠方法模式對於簡單工廠模式有什麼優點呢?
如果我們增加一種演算法的話,只需要增加這個演算法的類,然後增加一個這個演算法的工廠,即可, 需要修改的也就只有客戶端而已。
那麼有沒有更好的方法呢?(甚至連客戶端都不用修改) 那麼就還是上次咱們提到的,用反射來解決。(後面博文會講到的)。
好了,本篇博文與簡單工廠模式相類似,大家可以對比著來看,加深一下自己的理解。
ok。今天就講到這裡。下一次,將講解 原型模式
本系列將持續更新,喜歡的小伙伴可以點一下關註和推薦,謝謝大家的支持。