對於上一篇中的簡單工廠模式,它利用一個【工廠類】來有選擇型的實例化指定的對象(要利用加法類時,傳入參數「加法」以後工廠類就會去實例化OperateAdd類,並返回該實例),而對於工廠方法模式來講,他爲每一個操做類都建立一個工廠類,調用工廠類再來實例化指定對象!html
首先來建立一個接口,來統一各個工廠類的行爲
interface IFactory
{
Operation CreateOperation(); //返回值類型爲全部操做類的父類
}ide
public AddFactory:IFactory { public Operation CreateOperation() { return new OperationAdd(); } }
public SubFactory:IFactory { public Operation CreateOperation() { return new OperationSub(); } }
public MulFactory:IFactory { public Operation CreateOperation() { return new OperationMul(); } }
上述這些工廠類都返回給自對應的操做類的實例,當想要利用加法操做時,只須要調用工廠類中的CreateOperation方法便可,那麼對於到底該調用那個工廠類的邏輯判斷,就須要本身來寫了,這一點工廠方法模式和簡單工廠模式是不一樣的!spa
//定義一個父類,來統一計算操做。 public class Operate { private int _numberA; private int _numberB; public int numberA { set { _numberA = value; } get { return _numberA; } } public int numberB { set { _numberB = value; } get { return _numberB; } } //其實能夠將此類設置爲抽象類,此方法設置爲抽象方法,由於具體的實現都是在其派生類中進行的! public virtual int ObtainResult() {return 0; } } //加法類 public class OperationAdd:Operate { public override int ObtainResult() { return base.numberA + base.numberB; } } //減法類 public class OperationSub : Operate { public override int ObtainResult() { return base.numberA - base.numberB; } }
1.看起來工廠方法模式對於簡單工廠模式來講也米有優點,算是反倒麻煩了,由於對到底應該調用那一個工廠類的邏輯判斷拋了出來,須要在客戶端代碼中本身來作斷定。3d
2.工廠方法模式遵循了 開放-封閉原則,對於工廠方法模式來講,若是要對其進行擴展(添加除法操做),須要添加了一個繼承自Operate類的除法操做類,再添加一個實現IFactory接口的除法工廠類便可,而若是對簡單工廠模式進行擴展的話,不只須要增長操做類,還須要去對工廠類進行邏輯的修改,這麼一來就違背了開放-封閉原則。其實,二者本質的差異是由於在工廠方法模式中判斷到底調用那一個工廠類的操做拋給了客戶端代碼來實現,因此在組件的範圍內就不須要修改,只擴展便可。code