iOS常用設計模式——原型模式

1. 什麼是原型模式? (what)

原型模式屬於創建性設計模式,它通過拷貝的方式快速創建一個對象,這裏拷貝的方式有兩種:1.)淺拷貝(指針拷貝); 2.)深拷貝(值拷貝);採用原型模式創建一個新的對象效率更高。

 

什麼是深拷貝和淺拷貝? (What)

深拷貝也叫做值拷貝,新創建的對象會在內存中開闢新的空間,而把被拷貝對象的值拷貝過來;淺拷貝也叫做指針拷貝,新創建的對象的指針與原對象的指針指向相同的內存空間,並有相同的值,淺拷貝的對象就如同原對象的影子

 

NSString*str = @”AAA”;

NSString*strCopy = [str copy];

NSMutableString*strMCopy = [str mutableCopy];

 

NSLog(@”str對象:%@, 地址:%p”, str, str);

NSLog(@”strCopy對象:%@,地址: %p”, strCopy,strCopy);

NSLog(@”strMcopy對象:%@, 地址:%p”, strMcopy, strMCopy);

 

2014-10-07 09:28:18.578 Prototype_Demo[516:303] str對象:AAA, 地址:0x100001058
2014-10-07 09:28:18.579 Prototype_Demo[516:303] strCopy對象:AAA, 地址:0x100001058
2014-10-07 09:28:18.580 Prototype_Demo[516:303] strMCopy對象:AAA, 地址:0x10010af70

 

 

2. 什麼場景下使用原型模式? (Where)

1. 對象類型需要在運行時才能確定

2. 需要某對象在某狀態下的副本 

3. 對象間的差別很小,使用原型系統複製一個對象後再進行必要的修改

 

3. 如何實現原型模式? (How)

1.) 定義一個Person類,其中包含三個屬性變量:

 

@interface Person : NSObject <NSCopying, NSMutableCopying>

@property (nonatomic, copy)NSMutableString *name;

@property (nonatomic, copy) NSString*sex;

@property (nonatomic, assign) int age;

 

- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge;

 

 

2.)在實現文件中實現初始化和協議中必須實現的方法

 

- (id)initWithName:(NSMutableString *)aName withSex:(NSString *) aSex withAge:(int) aAge{

   if (self = [super init]) {

       self.name = aName;

       self.sex = aSex;

       self.age = aAge;

   }

   return self;

   

}

 

//這裏需要注意,當對象調用copy方法時,將得到不可變對象,不管該對象之前是可變還是不可變的。而調用mutableCopy則會得到可變對象,不管該對象之前是可變還是不可變。

 

- (id)copyWithZone:(NSZone *)zone

{

   Person *obj = [[self class] allocWithZone:zone];

   obj.name = [self.name mutableCopy];

   obj.sex = [self.sex copy];

   obj.age = self.age;

   

   return obj;

}

 

- (id)mutableCopyWithZone:(NSZone*)zone{

   

   Person *obj = [[self class] allocWithZone:zone];

   obj.name = [self.name mutableCopy];

   obj.sex = [self.sex copy];

   obj.age = self.age;

   return obj;

}

 

3.) 在main函數中使用copy和mutableCopy方法創建新的對象

NSMutableString *name = [NSMutableString stringWithFormat:@"AAA"];
Person *person = [[Person alloc] initWithName:name withSex:@"Boy" withAge:20];
Person *aPerson = [person copy];
NSLog(@"%@", aPerson.name);

Person *bPerson = [person mutableCopy];
NSLog(@"%@", bPerson.sex);


demo下載地址:http://download.csdn.net/detail/luozhonglan/8008379

發佈了41 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章