定义
原型模式有点像复制,不过该复制可以做一些修改,即从原对象复制出一个一模一样的对象后,然后可以选择性地修改复制后的对象,以此创建出一个需要的新对象。这里需要注意的是此处的复制指深拷贝,比较权威的定义如下所示:
THE PROTOTYPE PATTERN: Specify the kinds of objects to create using a prototypical instance,
and create new objects by copying this prototype.*
* The original definition appeared in Design Patterns, by the “Gang of Four” (Addison-Wesley,
1994).
翻译:使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象
原型模式的类图解钩大致如下所述:
其中Prototype是一个客户端所知悉的抽象原型类,在程序运行期间,所有由该抽象原型类具体化的原型类的对象都可以根据客户端的需要创建出一个复制体,这些具体化的原型类都需要实现抽象原型类的
clone方法。在IOS里面,抽象原型类一般指协议(delegate),该协议声明了一个必须实现的clone接口,而那些具体化的原型类则是实现了该协议的类。使用该种方法创建对象的主要应用场所是:
- 创建的对象比较复杂。(通过原型复制,使得封装简单化)
- 需要根据现有的原型自定义化自己的对象。(比如原型是一件白色衣服,自定义的则是黑色等其他衣服,通过复制修改后即可实现)
代码示例
抽象原型是一个鼠标页面,定义如下:
#import <UIKit/UIKit.h>
@protocol MyMouse <NSObject>
@property (nonatomic, strong) UIButton* leftButton; // 左键
@property (nonatomic, strong) UIButton* RightButton; // 右键
@property (nonatomic, strong) UILabel* panelSection; // 面板区
@property (nonatomic, strong) UIColor* color; // 鼠标颜色
- (id) clone;
@end
具体实现原型是一个蓝色鼠标,头文件要求遵从协议
MyMouse和
NSCoping,其代码如下:
#import <UIKit/UIKit.h>
#import "MyMouse.h"
// 实现协议MyMouse及深拷贝
@interface BlueMouse : UIView <NSCopying, MyMouse>
@end
对应的实现为:
#import "BlueMouse.h"
@implementation BlueMouse
@synthesize leftButton;
@synthesize RightButton;
@synthesize panelSection;
@synthesize color;
- (id)init
{
if(self = [super init])
{
self.leftButton = [[UIButton alloc] init];
self.RightButton = [[UIButton alloc] init];
self.panelSection = [[UILabel alloc] init];
self.color = [UIColor blackColor];
}
return self;
}
#pragma mark -- 实现协议NSCopying
- (id)copyWithZone:(NSZone *)zone
{
return [[[self class] allocWithZone:zone] init];
}
#pragma mark -- 实现抽象原型 MyMouse
- (id)clone
{
BlueMouse* mouse = [self copy];
mouse.color = [UIColor blueColor];
return mouse;
}
@end
实现代码主要是实现对象的
深拷贝,以及原型接口
clone,给鼠标赋予对应的颜色。
为了使用该原型创建出子子孙孙,其测试代码可以是:
BlueMouse* mouse = [[BlueMouse alloc] init];
NSLog(@"mouse -> object:%@ color:%@", mouse, mouse.color);
BlueMouse* mouse1 = [mouse clone];
NSLog(@"mouse1 -> object:%@ color:%@", mouse1, mouse1.color);
BlueMouse* mouse2 = [mouse clone];
NSLog(@"mouse2 -> object:%@ color:%@", mouse2, mouse2.color);
先构建一个对象,该对象的颜色是
黑色的,但是通过原型接口clone出得对象是
蓝色的,输出结果如下:
可以发现三个对象的地址都不一样的,表示都是不同的对象,颜色值mouse和mouse1不同,但是mouse1和mouse2相同的。
总结
这个原型设计模式好像其实就是一个深复制+自定义,其他未详,以后以后想明白了再来补充。