用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。
Prototype原型模式是一種創建型設計模式,Prototype模式允許一個對象再創建另外一個可定制的對象,根本無需知道任何如何創建的細節,工作原理是:通過將一個原型對象傳給那個要發動創建的對象,這個要發動創建的對象通過請求原型對象拷貝它們自己來實施創建。
它主要面對的問題是:“某些結構復雜的對象”的創建工作;由于需求的變化,這些對象經常面臨著劇烈的變化,但是他們卻擁有比較穩定一致的接口。
說直白點就是如果有一個對象很復雜, 重新創建要花費很多的代碼或者代價
這個時候可以考慮使用原型模式, 當要創建新實例時通過既有的實例復制一份,再修改不一樣的地方值
什么時候考慮使用原型模式呢?
1 有很多相關的類, 其行為略有不同, 而且主要差異在于內部屬性, 如名稱/圖像等.
2 需要使用組合(樹型)對象作為其他東西的基礎, 例如, 使用組合對象作為組件來構建另一個組合對象.
下面用代碼說明如何使用
先創建一個Protocol
#import <Foundation/Foundation.h>
@protocol PrototypeCopyProtocol <NSObject>
@required
/**
復制自己
@return 返回一個拷貝的對象
*/
- (id)clone;
@end
創建對象模型
Student.h
#import <Foundation/Foundation.h>
#import "PrototypeCopyProtocol.h"
@interface Student : NSObject <PrototypeCopyProtocol>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *age;
@property (nonatomic, strong) NSString *score;
@property (nonatomic, strong) NSString *address;
#pragma mark - PrototypeCopyProtocol method
- (id)clone;
@end
Student.m
#import "Student.h"
@implementation Student
- (id)clone {
Student *stu = [[[self class] alloc] init];
stu.name = self.name;
stu.age = self.age;
stu.score = self.score;
stu.address = self.address;
return stu;
}
@end
下面是Controller中使用:
- (void)viewDidLoad {
[super viewDidLoad];
//創建第一個學生實例
Student *stu1 = [[Student alloc] init];
stu1.name = @"Jackey";
stu1.age = @"18";
stu1.score = @"90";
stu1.score = @"重慶";
//創建第二個學生實例
Student *stu2 = [stu1 clone];
stu2.name = @"Franky";
}