Prototype(原型模型)

定义 Prototype pattern refers to creating duplicate object while keeping performance in mind. This type of design pattern comes under creational pattern as this pattern provides one of the best way to create an object.

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

问题:写一个叫做Person的类,该类有2个属性 age和name

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic,strong) NSString* name;
@property (nonatomic,strong) NSNumber* age;

@end

OK,大功告成,现在 我让你创建2个Person类的实例,一个叫做a,一个叫做b,这两个实例的age是一样的,都是10,但是一个name是a 一个name是b

我们的代码可以这样写

    Person* a=[[Person alloc] init];
    a.name=@"a";
    a.age=@(10);
    Person* b=[[Person alloc] init];
    b.name=@"b";
    b.age=@(10);

代码看起来也不是特别复杂。。现在 假设有好多好多属性 比如 sex height 等等呢? 然后 所有属性除了名字不一样以外,其他都一样呢。。。

很显然 我们可以为Person写一个叫做copy的函数 像这样

-(Person*) copy
{
    Person* newPerson=[[Person alloc] init];
    newPerson.name=self.name;
    newPerson.age=self.age;
    return newPerson;
}

这样 我们每次需要一个新的属性都一样或者差不多的对象的时候 就可以直接调用copy函数了 

这就是Prototype,实际上就是写了一个copy函数,没有什么高深的东西。

但是 这有什么用呢? 开始 我也很疑惑这一点,其实 上面的例子就已经解释了他的其中一个用途。

另外 还有一种用途(原谅我看不懂百度百科那些地方写得书面语言。。),在iOS的程序中,我们习惯使用MVC模式,这时候 如果Controller传入一个条件,然后Model根据这个条件处理自己 需要返回一个Person类的实例给controller,但是 我不想返回同一个指针啊,因为如果我返回了同一个指针给controller,那么他用指针修改这个数据 岂不是会修改我model中得数据? 这时候 你会很显然的想到 我重新拷贝一份Person 返回给它不就好了? 对。。这就是我认为Prototype的另外一个用途

好了 现在我们真正的回到iOS开发当中,之前写得那个copy也许不是完美的,因为iOS已经有copying这个协议了。。。

因此 当我们在做iOS开发的时候,如果需要使用到Prototype,其实可以这样做

实现他NSCopying和NSMutableCopying(浅拷贝和深拷贝以及可变不可变的区别,这里不再做描述了)协议,然后重写copyWithZone和mutableCopyWithZone函数,像这样

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying,NSMutableCopying>

@property (nonatomic,strong) NSString* name;
@property (nonatomic,strong) NSNumber* age;

@end

#import "Person.h"

@implementation Person

-(id) copyWithZone:(NSZone *)zone
{
    Person* person=[[[self class] allocWithZone:zone] init];
    person.name=[self.name copy];
    person.age=[self.age copy];
    return person;
}

-(id) mutableCopyWithZone:(NSZone *)zone
{
    Person* person=[[[self class] allocWithZone:zone] init];
    person.name=[self.name mutableCopy];
    person.age=[self.age mutableCopy];
    return person;
}

@end
然后外部调用的时候 直接 [a copy]即可,这才是符合iOS开发的一个Prototype模型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值