工廠模式算是開發中比較常見的設計模式,簡單工廠模式,工廠模式和抽象工廠模式,都屬於工廠模式。簡單工廠模式(simple factory)是類的建立模式,靜態工廠方法(static factory method)模式,簡單工廠模式就是由一個工廠類根據傳入的參數決定建立哪種的產品類。簡單工廠模式會包含過多的判斷條件,維護起來不是特別方便,工廠模式是主要經過依賴倒置將類的實例化推遲到子類中,實現動態擴展。抽象工廠模式是一個對象產品家族,根據需求提供不一樣的對象。設計模式
以前的文章中寫過一篇簡單工廠模式,假設咱們我有一個服裝加工工廠,能夠根據不一樣的需求生產不一樣的服飾,定義一個服裝基類和工廠類:ide
@protocol DressProtocol <NSObject> @optional -(void)provideMaterial; @optional -(void)product; @end @interface Dress : NSObject<DressProtocol> @end
服裝Dress子類ForeignDress:測試
@implementation ForeignDress -(void)provideMaterial{ NSLog(@"ForeignDress--準備原材料"); } -(void)product{ NSLog(@"ForeignDress--生產"); } @end
ChinaDress子類:spa
@implementation ChinaDress -(void)provideMaterial{ NSLog(@"ChinaDress---準備原材料"); } -(void)product{ NSLog(@"ChinaDress---生產"); } @end
工廠類Manufactor:設計
@protocol ManufactorProtocol <NSObject> @optional -(Dress *)createDress:(NSString *)type; @end @interface Manufactor : NSObject<ManufactorProtocol> -(void)start:(NSString *)type; -(void)simpleStart:(NSString *)type; -(void)startByCondition:(NSString *)type; @end
方法實現:3d
-(void)start:(NSString *)type{ if ([type isEqualToString:@"Foreign"]) { dress=[[ForeignDress alloc]init]; }else if([type isEqualToString:@"China"]){ dress=[[ChinaDress alloc]init]; } [dress provideMaterial]; [dress product]; } //博客園-FlyElephant 簡單工廠 -(void)simpleStart:(NSString *)type{ dress=[ManuFactory dressInstance:type]; [dress provideMaterial]; [dress product]; }
方法調用:對象
Manufactor *factor=[[Manufactor alloc]init]; [factor start:@"Foreign"]; [factor simpleStart:@"China"]; NSLog(@"博客園-FlyElephant"); NSLog(@"http://www.cnblogs.com/xiaofeixiang/");
測試效果:blog
第一種咱們在工廠中直接經過type類型判斷,不一樣的類型生產不一樣的服裝,可是若是type類型過多並且type實現的不必定的Dress服裝類,因此放在Manufactor不合適,咱們將其實現單獨放在一個簡單工廠裏面。 你會發現,每次不一樣的類型咱們都要去修改簡單工廠,牽一髮而動,不符合設計模式的"對擴展開放,對修改關閉"的原則,工廠模式能夠解決簡單工廠沒法解決的問題。接口
@implementation BJManufactor -(Dress *)createDress:(NSString *)type{ Dress *dress; if ([type isEqualToString:@"BJ"]) { dress=[[BJDress alloc]init]; }else if([type isEqualToString:@"BJSpecial"]){ dress=[[BJSpecialDress alloc]init]; } return dress; } @end
Manufactor基類中的條件判斷:
-(void)startByCondition:(NSString *)type{ Dress *myDress=[self createDress:type]; [myDress provideMaterial]; [myDress product]; }
具體調用實現:ci
Manufactor *bjfactor=[[BJManufactor alloc]init]; [bjfactor startByCondition:@"BJ"]; NSLog(@"博客園-FlyElephant"); NSLog(@"http://www.cnblogs.com/xiaofeixiang/");
效果:
抽象工廠基類,這裏只提供實現了Cloth:
@protocol AbstractFactory <NSObject> @optional -(Cloth *)provideCloth; @end @interface AbstractFactory : NSObject<AbstractFactory> @end
抽象工廠子類BJAbstractFactory:
@implementation BJAbstractFactory -(Cloth *)provideCloth{ return [[Cloth alloc] init]; } @end
Cloth類:
@implementation Cloth -(void)clothMethod{ NSLog(@"Cloth--Cloth"); } @end
Manufactor類中添加兩個新的方法:
-(void)configFactory:(AbstractFactory *)factory{ abstractFactory=factory; } -(void)startWithFactory:(NSString *)type{ Dress *myDress=[self createDress:type]; cloth=[abstractFactory provideCloth]; [cloth clothMethod]; [myDress provideMaterial]; [myDress product]; }
方法調用:
Manufactor *factor=[[BJManufactor alloc]init]; [factor configFactory:[[BJAbstractFactory alloc] init]]; [factor startWithFactory:@"BJ"]; NSLog(@"博客園-FlyElephant"); NSLog(@"http://www.cnblogs.com/xiaofeixiang/");
效果:
從實現邏輯來看抽象工廠模式和工廠模式和相似,抽象工廠模式的重點在於建立抽象接口來建立一組相關的產品。抽象工廠模式中,抽象工廠定義接口,全部的具體工廠必須實現該接口,該接口包含一組方法用來生產產品。每一個具體工廠可以生產一整組的產品。工程實踐中根據實際狀況進行擇優選擇~