Oh!Coder

Coding Life

Objective C--原型模式

| Comments

今天和大家分享的设计模式是原型模式。首先给大家展示一下基本定义:

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

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

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

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

pic

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

注意:本文所有代码均在ARC环境下编译通过。

  • 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;
}

上面就是一个简单的完整实例,理解起来不难吧,呵呵。第一次看见这个也是一个设计模式的时候都有点惊讶,这竟然也是一个设计模式哦!呵呵,玩笑可以开,还是理解当中的思想才是根本呀,简单的例子并不能说明什么,设计模式的奥妙之处还是需要日后慢慢体会呀,:D !

Comments