定義
原型模式有點像復制,不過該復制可以做一些修改,即從原對象復制出一個一模一樣的對象后,然后可以選擇性地修改復制后的對象,以此創(chuàng)建出一個需要的新對象,
原型模式(Prototype)
。這里需要注意的是此處的復制指深拷貝,比較權威的定義如下所示: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).
翻譯:使用原型實例指定創(chuàng)建對象的種類,并通過復制這個原型創(chuàng)建新的對象
原型模式的類圖解鉤大致如下所述:其中Prototype是一個客戶端所知悉的抽象原型類,在程序運行期間,所有由該抽象原型類具體化的原型類的對象都可以根據(jù)客戶端的需要創(chuàng)建出一個復制體,這些具體化的原型類都需要實現(xiàn)抽象原型類的clone方法。在IOS里面,抽象原型類一般指協(xié)議(delegate),該協(xié)議聲明了一個必須實現(xiàn)的clone接口,而那些具體化的原型類則是實現(xiàn)了該協(xié)議的類。使用該種方法創(chuàng)建對象的主要應用場所是:創(chuàng)建的對象比較復雜。(通過原型復制,使得封裝簡單化)需要根據(jù)現(xiàn)有的原型自定義化自己的對象。(比如原型是一件白色衣服,自定義的則是黑色等其他衣服,通過復制修改后即可實現(xiàn))
代碼示例
抽象原型是一個鼠標頁面,定義如下:
#import<UIKit/UIKit.h>@protocol MyMouse<NSObject>@property (nonatomic, strong) UIButton* leftButton; // 左鍵@property (nonatomic, strong) UIButton* RightButton; // 右鍵@property (nonatomic, strong) UILabel* panelSection; // 面板區(qū)@property (nonatomic, strong) UIColor* color; // 鼠標顏色- (id) clone;@end具體實現(xiàn)原型是一個藍色鼠標,頭文件要求遵從協(xié)議MyMouse和NSCoping,其代碼如下:
#import<UIKit/UIKit.h>#import "MyMouse.h"http:// 實現(xiàn)協(xié)議MyMouse及深拷貝@interface BlueMouse : UIView<NSCopying, MyMouse>@end對應的實現(xiàn)為:
#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 -- 實現(xiàn)協(xié)議NSCopying- (id)copyWithZone:(NSZone *)zone{ return [[[self class] allocWithZone:zone] init];}#pragma mark -- 實現(xiàn)抽象原型 MyMouse- (id)clone{ BlueMouse* mouse = [self copy]; mouse.color = [UIColor blueColor]; return mouse;}@end實現(xiàn)代碼主要是實現(xiàn)對象的深拷貝,以及原型接口clone,給鼠標賦予對應的顏色,
電腦資料
《原型模式(Prototype)》(http://www.stanzs.com)。為了使用該原型創(chuàng)建出子子孫孫,其測試代碼可以是:
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出得對象是藍色的,輸出結果如下:
可以發(fā)現(xiàn)三個對象的地址都不一樣的,表示都是不同的對象,顏色值mouse和mouse1不同,但是mouse1和mouse2相同的。
總結
這個原型設計模式好像其實就是一個深復制+自定義,其他未詳,以后以后想明白了再來補充。