IOS設計模式之工場模式

來源:互聯網
上載者:User

IOS設計模式之工場模式
IOS設計模式之工場模式
1 何為原廠模式:

在基類中定義建立對象的一個介面,讓子類決定實列化那個類.Factory 方法讓一個類的實列化延遲到子類進行.Factory 方法解決的問題是

對象的建立時機,它提供了一種擴充的策略,很好的符合了開放封閉原則.

 

2 原廠模式的設計:

將工廠和產品都抽象出一個基類,在基類中定義統一的介面,然後再具體的工廠同建立具體的產品.

 

3 Factory 方法模式的結構圖如下(摘自Object-C設計模式一書)




4 為何這是建立對象的安全方法(摘自Object-C設計模式一書)

與直接建立新的具體對象相比,使用Factory 方法建立對象可算一種最佳做法.Factory 方法模式讓客戶程式可以要求由Factory 方法建立的

對象擁有一組共同的行為.所以往類階層中注入新的具體產品並不需要修改用戶端代碼,因為返回的任何具體對象的介面都跟客戶

端一致再用的從前的介面相同.

 

下面以程式來展示原廠模式:/********************/
BreedOfDogProtocol.h

//定義狗的品種的方法

@protocol BreedOfDogProtocol

-(NSString *) getBreed;//得到狗的品種的公用方法

@end

/********************/

BreedOfDog.h

 

@interface BreedOfDog :NSObject

@property NSString *_breed;

@end

 

BreedOfDog.m

 

@implementation BreedOfDog

-(NSString *) getBreed{

return 0;

}

@end

/********************/

BorderCollie.h

 

//邊境牧羊犬

@interface BorderCollie : BreedOfDog

@end

 

BorderCollie.m

 

@implementation BorderCollie

 

-(NSString *) getBreed{

return@BorderCollie;

}

@end

/********************/

JiWawa.h

 

//吉娃娃

@interface JiWawa : BreedOfDog

@end

 

JiWawa.m

 

@implementation JiWawa

 

-(NSString *)getBreed{

return@jiWawa;

}

@end

/********************/

定義Factory 方法 BreedOfDogFactory.h

@interface BreedOfDogFactory :NSObject

-(BreedOfDog *) getDifferentBreedOfDog;

@end

 

BreedOfDogFactory.m

 

@implementation BreedOfDogFactory

-(BreedOfDog *) getDifferentBreedOfDog{

return nil;

 

}

@end

/********************/

BorderCollieFactory.h

 

@interface BorderCollieFactory :BreedOfDogFactory

@end

 

BorderCollieFactory.m

@implementation BorderCollieFactory

-(BreedOfDog *) getDifferentBreedOfDog{

return [[BorderColliealloc] init];

 

}

@end

/********************/

JiWawaFactory.h

 

@interface JiWawaFactory : BreedOfDogFactory

@end

 

JiWawaFactory.m

 

@implementation JiWawaFactory

-(BreedOfDog *)getDifferentBreedOfDog{

 

return [[JiWawaalloc] init];

}

@end

/********************/

main.m

 

 

int main(int argc,const char * argv[]) {

 

BreedOfDogFactory *breedFactory = [[BorderCollieFactoryalloc] init];

BorderCollie * borderCollie = [breedFactory getDifferentBreedOfDog];

NSLog(@%@,[borderColliegetBreed]);

return 0;

}


5 也許在使用原廠模式的時候你會想到NSNumber類,他的設計思想和原廠模式差不多

NSNumber子類圖

 

 

 

建立一個NSNumber對象有以下方法:
  • + numberWithBool:
  • + numberWithChar:
  • + numberWithDouble:
  • + numberWithFloat:
  • + numberWithInt:
  • + numberWithInteger:
  • + numberWithLong:
  • + numberWithLongLong:
  • + numberWithShort:
  • + numberWithUnsignedChar:
  • + numberWithUnsignedInt:
  • + numberWithUnsignedInteger:
  • + numberWithUnsignedLong:
  • + numberWithUnsignedLongLong:
  • + numberWithUnsignedShort:

     

     

    6 為什麼使用NSNumber類?在基礎類已經完善的情況下?

     

    例如:

    NSInteger是基礎類,但是NSNumber是一個類,如果想要儲存一個數值,直接用NSInteger時不行得,比如在Array中.

     

    NSArray *array = [[NSArray alloc] init];

    [array addObject :3]; //會造成編譯錯誤,因為NSArray裡面儲存的是一個類,二不能直接儲存一個數值.

     

    NSArray *array = [[array alloc] init];

    [array addObject :[NSNumber numberWithInt : 3]];//不會造成編譯錯誤,因為NSNumber產生的是一個對象.

     

    Cocoa提供了NSNumber來封裝(ji以對象的形式實現)基礎資料型別 (Elementary Data Type).




     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.