天天看點

Objective C--簡單工廠模式

前言

自上一篇文章有兩個禮拜的時間了,本來想餘下一段時間内盡量用英文寫文章,包括技術文。前兩天點點網的統計資料裡添加了對每個部落格裡文章通路量的一個排名,發現我的部落格裡通路最多的竟然是Objective C!說實話,有些意外,後細想來也許有很多和我一樣的初學者朋友想學習這門語言,猶豫再三,本着分享知識的原則,還是用中文寫吧,其他類型的文章再當練習英語,用英文來寫。好啦,廢話就到這裡吧,接下來進入正題。

今天開始,我們來探讨一下用Objective C來簡單實作的常見的設計模式。這次想和大家分享的是:簡單工廠模式。

嚴格說來,簡單工廠模式不屬于GoF的23種設計模式之列,但是作為簡單的入門知識,我還是想從簡單工廠模式開始說起。

正如此模式的名稱一樣,簡單工廠模式基本上是所有設計模式裡最簡單的一種,類與類之間的關系一目了然。這次我就用很多地方經常舉的例子--電腦,來說明這個模式。首先給大家展示一下類之間的結構圖:

Objective C--簡單工廠模式

通過這張結構圖,可以清晰的看到,加法類、減法類、乘法類、除法類繼承自運算類,簡單工廠類依賴于運算類的執行個體化來實作相應的運算功能,好的,看起來并不複雜,讓我們直接展示一下代碼吧(鑒于目前點點不支援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!下次繼續吧!

繼續閱讀