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語句判別需要實例化哪種類型,之後進行計算,獲取結果。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章