我們總說面向對象要有可維護性,可擴展性,可復用性。今天我們就來學習一種簡單地設計模式--簡單工廠模式(FACTORY)。通過面向對象的封裝,繼承和多態來降低程序的耦合度。下面就讓我們來深入學習這個模式。
工廠模式:客戶類和工廠類分開。消費者任何時候需要某種產品,只需向工廠請求即可。消費者無須修改就可以接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。
我們來看一個簡單的例子:一個有關計算器的例子,用戶可以輸入兩個數和操作符號,然後得到結果,普通的思路的代碼實例:
//進行運算操作
if ([strOperation isEqualToString:@+]) {
NSLog(@+);
double result = [strFirstNum doubleValue]+[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}else if([strOperationisEqualToString:@-]){
NSLog(@-);
double result = [strFirstNum doubleValue]-[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}else if([strOperationisEqualToString:@*]){
NSLog(@*);
double result = [strFirstNum doubleValue]*[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
else if([strOperationisEqualToString:@/]){
NSLog(@/);
//判斷除數不能為0
if ([strSecondNum isEqualToString:@0]) {
NSLog(@除數不能為0);
UIAlertView* tempAlert = [[UIAlertViewalloc] initWithTitle:@警告message:@除數不能為0 delegate:nilcancelButtonTitle:@取消 otherButtonTitles:nil];
[tempAlert show];
}else{
double result = [strFirstNum doubleValue]/[strSecondNum doubleValue];
self.ResultTextField.text = [NSStringstringWithFormat:@%f,result];
}
}
上面代碼確實可以實現這個功能,但是我們卻沒有考慮到:如果以後需要提供開平方運算,乘方運算擴展時候,改如何做呢?直接加個if else?如果加入了100種運算呢?如果這樣去做是不是每次都要去改這部分代碼,這樣有悖我們可擴展性原則。所以我們需要引入簡單工廠模式,把運算給抽象出來,並且加入運算工廠用於接收用戶的操作,簡單工廠方法代碼:
UML圖:

操作方法協議接口:
#import/*! * 操作方法協議接口 * * @since V1.0 */ @protocol OperationProtocol -(double)getResult; @end
操作方法父類:
#import#import OperationProtocol.h /*! * 操作方法父類 * * @since V1.0 */ @interface Operation : NSObject @property double firstNum;//第一個操作數 @property double secondNum;//第二個操作數 @end
加法實現類:
#import Operation.h /*! * 加法實現類 * * @since V1.0 */ @interface OperationAdd : Operation @end
操作工廠類:
#import#import Operation.h #import OperationAdd.h #import OperationSub.h #import OperationMultiply.h #import OperationDivide.h /*! * 操作工廠類 * * @since V1.0 */ @interface OperationFactory : NSObject //獲得操作對象 +(Operation*)createOperate:(NSString*)operateStr; @end
客戶端代碼:
- (IBAction)clickingOperation:(id)sender {
NSString* strFirstNum = self.firstNumTextField.text;
NSString* strSecondNum = self.secondNumTextField.text;
Operation* oper;
oper = [OperationFactory createOperate:self.operationTextField.text];
oper.firstNum = [strFirstNum doubleValue];
oper.secondNum = [strSecondNum doubleValue];
self.resultTextField.text = [NSString stringWithFormat:@%f,[oper getResult]];
}
通過簡單工廠模式的重構,這樣我們就實現了低耦合度的代碼結構,做到了對擴展開放,對修改關閉。如果再增加任何的操作方法,只需要繼承操作方法父類,新建一個操作子類,並且在工廠方法裡面多加一個if else的判斷即可。怎麼樣很簡單吧。
以上是所有內容,希望對大家有所幫助。
詳細代碼下載地址:
重構前:http://download.csdn.net/detail/u010013695/6944273
重構後:http://download.csdn.net/detail/u010013695/6944291