在印刷术还没有普及的时代,人们发现组合使用常用的木头印章在纸上大量复制同一信息是一种非常容易的方法,这使得信息的传播变得更加容易。
在许多面向对象的编程中,有些对象的创建代价过大或过于复杂。如果可以重建相同的对象并作轻微的改动,事情会容易很多。应用于“复制”操作的模式称为原型模式。
prototypePattern.jpg下面两种常见情形可以考虑使用原型模式:
1、有很多相关的类,其行为略有不同,而且主要差异在于内部属性,如名称、图像等;
2、需要使用组合对象作为其他东西的基础;
从功能的角度看,不管什么对象,只要复制自身比手工实例化要好,都可以是原型对象;
OC中,通过NSCopying协议及其方法copyWithZone:实现对象的复制;
简单举个栗子:
#import <Foundation/Foundation.h>
#import "Mark.h"
NS_ASSUME_NONNULL_BEGIN
@interface Vertex : NSObject <Mark,NSCopying>
{
@protected
CGPoint location_;
}
@property(strong,nonatomic)UIColor *color;
@property(assign,nonatomic)CGFloat size;
@property(assign,nonatomic)CGPoint location;
@property(assign,nonatomic,readonly)NSUInteger count;
@property(assign,nonatomic,readonly)id <Mark> lastChild;
- (id)initWithLocation:(CGPoint)location;
@end
NS_ASSUME_NONNULL_END
#import "Vertex.h"
@implementation Vertex
@synthesize location = location_;
@dynamic color,size;
- (id)initWithLocation:(CGPoint)location {
if (self = [super init]) {
[self setLocation:location];
}
return self;
}
- (nonnull id)copyWithZone:(nullable NSZone *)zone {
Vertex *vertexCopy = [[Vertex allocWithZone:zone]initWithLocation:location_];
return vertexCopy;
}
网友评论