上篇博客我們學習了簡單工廠模式,今天我們深入一點,學習一下工廠方法模式。工廠方法模式是在簡單工廠模式的基礎上延伸出來的,只不過把原來的工廠類給抽象出來了,這樣是的工廠類可擴展性增強。從而進一步的進行了抽象。
定義一個用於創建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類。
結構圖:
簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態的實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式的客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯移到了客戶端代碼來進行。如果我們想要增加功能,本來是改工廠類的,而現在是修改客戶端。
不管是簡單工廠模式,工廠方法模式還是抽象工廠模式,他們具有類似的特性,所以他們的適用場景也是類似的。
首先,作為一種創建類模式,在任何需要生成復雜對象的地方,都可以使用工廠方法模式。有一點需要注意的地方就是復雜對象適合使用工廠模式,而簡單對象,特別是只需要通過new就可以完成創建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度。
其次,工廠模式是一種典型的解耦模式,迪米特法則在工廠模式中表現的尤為明顯。假如調用者自己組裝產品需要增加依賴關系時,可以考慮使用工廠模式。將會大大降低對象之間的耦合度。
再次,由於工廠模式是依靠抽象架構的,它把實例化產品的任務交由實現類完成,擴展性比較好。也就是說,當需要系統有比較好的擴展性時,可以考慮工廠模式,不同的產品用不同的實現工廠來組裝。
現在我們就把上次的計算器的簡單工廠模式的代碼改造一下:
UML圖:
工廠協議接口:
#import#import Operation.h /*! * 工廠協議接口 * * @since V1.0 */ @protocol IFactoryProtocol -(Operation*)createOperate; @end
生產工廠父類:
#import#import IFactoryProtocol.h /*! * 生產工廠父類 * * @since V1.0 */ @interface FactoryBase : NSObject @end
加法工廠類:
#import#import OperationAdd.h #import FactoryBase.h /*! * 加法工廠類 * * @since V1.0 */ @interface AddFactoy : FactoryBase @end
客戶端代碼:
- (IBAction)clickingOperation:(id)sender { NSString* strFirstNum = self.firstNumTextField.text; NSString* strSecondNum = self.secondNumTextField.text; NSString* strOperation = self.operationTextField.text; FactoryBase* facBase; if ([strOperation isEqualToString:@+]) { facBase = [[AddFactoy alloc] init]; }else if([strOperation isEqualToString:@-]){ facBase = [[SubFactory alloc] init]; }else if([strOperation isEqualToString:@*]){ facBase = [[MulFactory alloc] init]; }else if([strOperation isEqualToString:@/]){ facBase = [[DivFactory alloc] init]; } Operation* oper; oper = [facBase createOperate]; oper.firstNum = [strFirstNum doubleValue]; oper.secondNum = [strSecondNum doubleValue]; self.resultTextField.text = [NSString stringWithFormat:@%f,[oper getResult]]; }
通過上面的改造部分可以看出,我們對工廠類進行了抽象,以後如果再增加了新的操作方法,我們只需要在原來的基礎上動態的擴展工廠子類即可。這也是工廠方法的優勢所在。
3 結語
以上是所有內容,希望對大家有所幫助,十分感謝!
完整代碼下載地址:http://download.csdn.net/detail/u010013695/6945141