Objective C 原型模式

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

 原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节,其实我觉得就是多了一个克隆方法而已,所以呢,看起来挺简单的一个功能竟然也是设计模式里的一种,老实说多少有些惊讶哦!

 好啦,在继续下面之前,先简单说明一下拷贝(Copy)这个概念。在这个模式里拷贝分为浅拷贝和深拷贝。其实我认为这两种拷贝方式主要是针对指针而言的(C#里叫引用)。好的,我们来看一下具体是指什么。所谓浅拷贝是指如果字段是值类型的,则对该字段执行逐位复制,如果字段是指针(或称为引用)类型,则复制指针(或引用)但不复制指针(或引用)所指向的对象;因此,原始对象及其复本引用同一对象。那么相对于浅拷贝来说,深拷贝的概念就比较容易推出了,即如果字段是值类型,那么会逐位复制,如果字段是指针(或引用)类型,那么会在内存中重新开辟一块儿内存空间把该指针字段所指向的内容完整的复制一份放到新开辟的这块儿内存中,和浅拷贝的不同点就在这里了,深拷贝完成之后,指针(或引用)会指向不同的内存空间互不干涉。

 简单解释了一下深拷贝和浅拷贝,下面给出原型模式的类结构图。

 上面这幅类的结构图很简单,只有一层继承关系而已,就不过多解释了,下面直接给出两个类型的代码。

===========================================

  • Prototype类接口

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>
             
@interface Prototype: NSObject
@property ( copy ) NSString * id ;
-(Prototype*)MyInit:( NSString *)myId;
-(Prototype*) Clone;
@end
  • Prototype类实现

1
2
3
4
5
6
7
8
9
10
11
12
#import "Prototype.h"
           
@implementation Prototype
@synthesize id ;
-(Prototype*)MyInit:( NSString *)myId{
   [ self setId:myId];
   return self ;
}
-(Prototype*)Clone{
   return [[Prototype alloc]init];
}
@end
  • ConcretePrototype1类接口

1
2
3
4
5
#import "Prototype.h"
        
@interface ConcretePrototype1:Prototype
-(ConcretePrototype1*)MyInit:( NSString *)myId;
@end
  • ConcretePrototype1类实现

1
2
3
4
5
6
7
8
9
10
11
#import "ConcretePrototype1.h"
      
@implementation ConcretePrototype1
-(ConcretePrototype1*)MyInit:( NSString *)myId{
   [ super setId:myId];
   return self ;
}
-(Prototype*)Clone{
  return [[Prototype alloc]MyInit:[ super id ]];
}
@end
  • Main方法实现

1
2
3
4
5
6
7
8
9
10
11
12
#import <Foundation/Foundation.h>
#import "ConcretePrototype1.h"
    
int main ( int argc, const char *argv[])
{
   @autoreleasepool {
   ConcretePrototype1 *p1 = [[ConcretePrototype1 alloc]MyInit:@ "Hello" ];
   ConcretePrototype1 *c1 = (ConcretePrototype1*)[p1 Clone];
   NSLog (@ "MyCloned is %@" , [c1 id ]);
   }
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值