iOS開發-工廠模式


工廠模式算是開發中比較常見的設計模式,簡單工廠模式,工廠模式和抽象工廠模式,都屬於工廠模式。單工廠模式(simple factory)是類的創建模式,靜態工廠方法(static factory method)模式,簡單工廠模式就是由一個工廠類根據傳入的參數決定創建哪一種的產品類。簡單工廠模式會包含過多的判斷條件,維護起來不是特別方便,工廠模式是主要通過依賴倒置將類的實例化推遲到子類中,實現動態擴展。抽象工廠模式是一個對象產品家族,根據需求提供不同的對象。

簡單工廠模式

之前的文章中寫過一篇簡單工廠模式,假設我們我有一個服裝加工工廠,可以根據不同的需求生產不同的服飾,定義一個服裝基類和工廠類:

@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子類:

@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

方法實現:

-(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/");

測試效果:

第一種我們在工廠中直接通過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];
}

具體調用實現:

    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/");

 效果:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM