iOS常用設計模式——簡單工廠設計模式
簡單工廠設計模式詳解
簡單工廠設計模式詳解 基本概念 結構圖 經典的樣本 範例程式碼 優點 缺點 使用條件
基本概念
“專門定義一個類來負責建立其他類的執行個體,被建立的執行個體通常具有共同的父類。”
世界上就是由一個工廠類,根據傳入的參數,動態地決定建立出哪一個產品類的執行個體。
結構圖
ConcreteProduct1和ConcreteProduct2兩個產品具有一個共同的父類IProject,簡單工廠類為SimpleFactory,負責根據傳入的不同參數來決定生產ConcreteProduct1還是ConcreteProduct2產品。
經典的樣本
最經典的樣本就是運算類,加、減、乘、除四個運算子都繼承自父類Operation,有兩個屬性和一個操作方法,這些加減乘除的對象並不是直接在ViewController中建立,而是根據輸入操作符,由簡單工廠OperationFactory來建立。
範例程式碼
(1)建立一個協議OprationProtocol,由父類Operation來遵從該協議
/* * 操作方法協議介面 */@protocol OperationProtocol -(double)getResult;@end
(2)定義加減乘除操作的父類Operation
#import OperationProtocol.h/* * 操作方法父類 */@interface Operation : NSObject@property double firstNum;//第一個運算元@property double secondNum;//第二個運算元 @end
(3)加減乘除實作類別,此處以”加”舉例說明
//OperationAdd.h檔案#import Operation.h/* * 加法實作類別 */@interface OperationAdd : Operation@end//OperationAdd.m檔案#import "OperationAdd.h"@implementation OperationAdd-(double)getResult{ double result = 0; result = self.firstNum+self.secondNum;//"+"是OperationAdd時候使用,"+-*/"分別對應"加減乘除" return result;}@end
(4)簡單工廠類的代碼
//OpeartionFactory.h file#import Operation.h#import OperationAdd.h#import OperationSub.h#import OperationMultiply.h#import OperationDivide.h/* * 操作工廠類 */@interface OperationFactory : NSObject//獲得操作對象+(Operation*)createOperate:(NSString*)operateStr;@end//OpeartionFactory.m file#import "OperationFactory.h"@implementation OperationFactory+(Operation*)createOperate:(NSString*)operateStr{ Operation* oper = nil; //根據不同的操作符,建立不同的操作對象,"+-*/"分別對應"加減乘除" if ([operateStr isEqualToString:@"+"]) { oper = [[OperationAdd alloc] init]; }else if ([operateStr isEqualToString:@"-"]){ oper = [[OperationSub alloc] init]; }else if ([operateStr isEqualToString:@"*"]){ oper = [[OperationMultiply alloc] init]; }else if ([operateStr isEqualToString:@"/"]){ oper = [[OperationDivide alloc] init]; } return oper;}@end
(5)用戶端代碼,在ViewController中使用OperationFactory
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]];
通過簡單原廠模式的重構,我們就是閑了低耦合度的代碼結構,做到了對外擴充開放,對修改關閉。如果再增加任何的操作方法,只需要繼承操作方法父類,建立一個操作子類,並且在簡單工廠類裡面多添加一個else if的判斷即可。
優點
簡單Factory 方法從代碼中消除了對應用程式特有類的耦合,調用者不必關心具體實現,取消了常建者的責任,實現了對責任的分割
缺點
工程類集中了所有產品的邏輯,一旦不能正常工作,整個系統受影響,當分類較多時,所有建立工作都在Factory 方法中實現,後期擴充較為發雜
使用條件
(1)工廠類負責建立的對象較少時;
(2)用戶端只知道傳入工廠類的參數,對於如何建立對象的邏輯不必關心時。