原型模式:当创建给定类的实例过程很昂贵或者很复杂的时候,就使用原型模式。
原型模式是创建型模式之一。这里不看UML图,光看定义貌似不是很清晰,不过学过iOS的同学应该知道copy/mutablecopy这两个方法。调用这两个方法就是为避免昂贵或复杂的创建过程而采取的一种简洁的方式。所以iOS中已经免费为我们提供了原型模式的创建过程。当然我们这里还是以探究模式的实现过程为核心,所以并不打算使用系统提供的copy方法。

举个栗子
创建100只羊。
clone能力的协议
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol CloneAble <NSObject>
-(instancetype)clone;
@end
NS_ASSUME_NONNULL_END
羊的类,实在想不出羊到底该有哪些属性了,就只给三个
#import <Foundation/Foundation.h>
#import "CloneAble.h"
NS_ASSUME_NONNULL_BEGIN
@interface Sheep : NSObject<CloneAble>
@property (nonatomic ,strong)NSString * color;
@property (nonatomic ,assign)NSInteger age;
@property (nonatomic ,strong)NSString * name;
@end
NS_ASSUME_NONNULL_END
羊的实现,这里实现了clone方法和description方法。
#import "Sheep.h"
@implementation Sheep
-(instancetype)clone {
Sheep * sheep = [[Sheep alloc] init];
if (sheep) {
sheep.age = self.age;
sheep.color = self.color;
}
return sheep;
}
- (NSString *)description
{
NSDictionary * info = @{
@"name":self.name,
@"age":@(self.age),
@"color":self.color
};
return [NSString stringWithFormat:@"<%@:%p,%@>",[self class],self,info];
}
@end
具体调用。
说明:我们只想看到羊创建成功了没,所以并不关心羊的存储及使用问题。
#import <Foundation/Foundation.h>
#import "Sheep.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Sheep * sheep = [[Sheep alloc] init];
sheep.name = @"喜洋洋";
sheep.age = 4;
sheep.color = @"白色";
for (int i = 0; i < 99; i++) {
Sheep * sh = [sheep clone];
sh.name = [NSString stringWithFormat:@"克隆%d号",i+1];
NSLog(@"%@",sh);
}
}
return 0;
}
优点
1.向客户隐藏创建新对象的复杂性
2.提供向客户提供产生未知对象的选项
3.有些时候复制比创建对象更有效
缺点
有些时候对象的复制会相当的复杂
网友评论