iOS開發-工廠模式

工廠模式算是開發中比較常見的設計模式,簡單工廠模式,工廠模式和抽象工廠模式,都屬於工廠模式。單工廠模式(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不合適,咱們將其實現單獨放在一個簡單工廠裏面。 你會發現,每次不一樣的類型咱們都要去修改簡單工廠,牽一髮而動,不符合設計模式的"對擴展開放,對修改關閉"的原則,工廠模式能夠解決簡單工廠沒法解決的問題。接口

工廠模式

假設公司效益比較好,工廠須要新增北京分廠,上海分廠的時候,這是時候經過簡單工廠沒法解決類擴展的問題,簡單工廠之因此簡單就是在於在同一個地方進行對象處理,工廠方法模式(Factory Method Pattern)工在基類中創建一個抽象方法,子類能夠經過改寫這一方法來改變建立對象的具體過程。工廠方法模式讓子類來決定如何建立對象,來達到封裝的目的。
 假設咱們新增了北京分廠,屬於北京分廠的服裝能夠直接調用北京工廠來完成:
@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/");

 效果:

從實現邏輯來看抽象工廠模式和工廠模式和相似,抽象工廠模式的重點在於建立抽象接口來建立一組相關的產品。抽象工廠模式中,抽象工廠定義接口,全部的具體工廠必須實現該接口,該接口包含一組方法用來生產產品。每一個具體工廠可以生產一整組的產品。工程實踐中根據實際狀況進行擇優選擇~

相關文章
相關標籤/搜索