iOS设计模式-原型模式
定义:用原型实例指定创建对象的种类,在运行时抽象子类任何对象都可以按照客户端的意愿被复制。
注:通俗一点讲就是通过拷贝的方式快速复制该类一个对象
类型:对象创建
注:对象的拷贝分为浅拷贝和深拷贝,浅拷贝是指指针拷贝,或者对于有层级的对象拷贝时,有部分层级是浅拷贝(如数组,对数组是深拷贝,但对数组中的对象是浅拷贝,也属于浅拷贝的范畴),深拷贝不光拷贝指针还拷贝在内存中的指向的对象。
应用场景
#import <Foundation/Foundation.h> @interface Person : NSObject<NSCopyin,NSMutableCopying> @property(nonatomic, copy)NSString *name; @property(nonatomic, assign)NSInteger age; - (id)copyWithZone:(NSZone *)zone; - (id)mutableCopyWithZone:(NSZone *)zone; - (void)copyProperty:(Person *)person; @end
#import "Person.h" @implementation Person - (void)copyProperty:(Person *)person{ person.name = _name; person.age = _age; } - (id)copyWithZone:(NSZone *)zone{ Person *person = [[self class] allocWithZone:zone]; [self copyProperty:person]; return person; } - (id)mutableCopyWithZone:(NSZone *)zone{ Person *person = [[self class] allocWithZone:zone]; [self copyProperty:person]; return person; }
#import "Person.h" @interface Programmer : Person @property(nonatomic, copy)NSString *skill; @end
#import "Programmer.h" @implementation Programmer - (void)copyProperty:(Programmer *)person{ [super copyProperty:person]; person.skill = _skill; } - (id)copyWithZone:(NSZone *)zone{ Programmer *programmer = [[self class] allocWithZone:zone]; [self copyProperty:programmer]; return programmer; } - (id)mutableCopyWithZone:(NSZone *)zone{ Programmer *programmer = [[self class] allocWithZone:zone]; [self copyProperty:programmer]; return programmer; }
测试
Programmer *programmer = [[Programmer alloc]init]; programmer.name = @"Hello world!"; Programmer *programmer1 = programmer; Programmer *programmer2 = [programmer copy]; programmer.name = @"hello iOS!"; NSLog(@"%@ == %@ == %@",programmer.name,programmer1.name,programmer2.name);
2016-08-08 17:45:35.446 DesignPatternsDemo[7148:779654] hello iOS! == hello iOS! == Hello world!