前言
自上一篇文章有兩個禮拜的時間了,本來想餘下一段時間内盡量用英文寫文章,包括技術文。前兩天點點網的統計資料裡添加了對每個部落格裡文章通路量的一個排名,發現我的部落格裡通路最多的竟然是Objective C!說實話,有些意外,後細想來也許有很多和我一樣的初學者朋友想學習這門語言,猶豫再三,本着分享知識的原則,還是用中文寫吧,其他類型的文章再當練習英語,用英文來寫。好啦,廢話就到這裡吧,接下來進入正題。
今天開始,我們來探讨一下用Objective C來簡單實作的常見的設計模式。這次想和大家分享的是:簡單工廠模式。
嚴格說來,簡單工廠模式不屬于GoF的23種設計模式之列,但是作為簡單的入門知識,我還是想從簡單工廠模式開始說起。
正如此模式的名稱一樣,簡單工廠模式基本上是所有設計模式裡最簡單的一種,類與類之間的關系一目了然。這次我就用很多地方經常舉的例子--電腦,來說明這個模式。首先給大家展示一下類之間的結構圖:
通過這張結構圖,可以清晰的看到,加法類、減法類、乘法類、除法類繼承自運算類,簡單工廠類依賴于運算類的執行個體化來實作相應的運算功能,好的,看起來并不複雜,讓我們直接展示一下代碼吧(鑒于目前點點不支援Objective C的代碼高亮,是以就直接寫啦,盡量保持整齊吧。另,為了照顧像我一樣基礎不是很好的同學,我盡量把代碼寫全,友善大家調試)。
1 2 3 4 5 6 7 8 9 10 | #import <Foundation/Foundation.h> @interface Operation : NSObject { double numberA; double numberB; } @property double numberA; @property double numberB; -( double ) GetResult; @end |
1 2 3 4 5 6 7 8 9 10 | #import"Operation.h" @implementation Operation @synthesize numberA, numberB; -( double ) GetResult{ return -1.0; //此處預設傳回-1.0,無其他意義 } @end |
1 2 3 4 | #import "Operation.h" @interface OperationAdd:Operation @end |
1 2 3 4 5 6 7 8 9 10 11 | #import "OperationAdd.h" @implementation OperationAdd -( double ) GetResult{ double result =0; result =numberA+numberB; return result; } @end |
1 2 3 | #import "Operation.h" @interface OperationSub:Operation @end |
1 2 3 4 5 6 7 8 9 10 11 | #import "OperationSub.h" @implementation OperationSub -( double )GetResult{ double result =0; result = numberA-numberB; return result; } @end |
1 2 3 | #import "Operation.h" @interface OperationMul:Operation @end |
1 2 3 4 5 6 7 8 9 10 11 | #import "OperationMul.h" @implementation OperationMul -( double )GetResult{ double result =0; result = numberA*numberB; return result; } @end |
1 2 3 4 | #import "Operation.h" @interface OperationDiv:Operation @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #import "OperationDiv.h" @implementation OperationDiv -( double )GetResult{ double result =0; @try { result = numberA/numberB; } @catch ( NSException *exception) { NSLog (@ "除數不能為0" ); } return result; } @end |
- 下面是工廠類(依賴執行個體化運算類實作具體功能):
1 2 3 4 5 6 7 8 9 | #import <Foundation/Foundation.h> #import "OperationAdd.h" #import "OperationDiv.h" #import "OperationSub.h" #import "OperationMul.h" @interface OperationFactory: NSObject +(Operation*)CreateOperate:( char )operate; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #import "OperationFactory.h" @implementation OperationFactory +(Operation*)CreateOperate:( char )operate{ Operation *oper; switch (operate) { case '+' : oper = [[OperationAdd alloc]init]; break ; case '-' : oper = [[OperationSub alloc]init]; break ; case '*' : oper = [[OperationMul alloc]init]; break ; case '/' : oper = [[OperationDiv alloc]init]; break ; default : oper = nil ; break ; } return oper; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #import <Foundation/Foundation.h> #import "OperationAdd.h" #import "OperationDiv.h" #import "OperationMul.h" #import "OperationSub.h" #import "OperationFactory.h" int main ( int argc, const char * argv[]) { @autoreleasepool { Operation *oper = [OperationFactory CreateOperate: '*' ]; [oper setNumberA:1]; [oper setNumberB:2]; double result = 0; result = [oper GetResult]; NSLog (@ "Result is %f" , result); } return 0; } |
好啦,上面羅列的是簡單工廠模式的基礎代碼。其實還是挺簡單的,對吧,隻有一層繼承關系,一個依賴關系,在工廠類裡面用switch語句判别需要執行個體化哪種類型,之後進行計算,擷取結果。
That's all!下次繼續吧!