我們總說面向對象要有可維護性,可擴展性,可復用性。今天我們就來學習一種簡單地設計模式--簡單工廠模式(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