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