正如此模式的名稱一樣,簡單工廠模式基本上是所有設計模式裏最簡單的一種,類與類之間的關係一目瞭然。這次我就用很多地方經常舉的例子--計算器,來說明這個模式。首先給大家展示一下類之間的結構圖:
通過這張結構圖,可以清晰的看到,加法類、減法類、乘法類、除法類繼承自運算類,簡單工廠類依賴於運算類的實例化來實現相應的運算功能,好的,看起來並不複雜,讓我們直接展示一下代碼吧(鑑於目前點點不支持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語句判別需要實例化哪種類型,之後進行計算,獲取結果。