定義
原型模式有點(diǎn)像復(fù)制,不過該復(fù)制可以做一些修改,即從原對象復(fù)制出一個一模一樣的對象后,然后可以選擇性地修改復(fù)制后的對象,以此創(chuàng)建出一個需要的新對象,
原型模式(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)建對象的種類,并通過復(fù)制這個原型創(chuàng)建新的對象
原型模式的類圖解鉤大致如下所述:其中Prototype是一個客戶端所知悉的抽象原型類,在程序運(yùn)行期間,所有由該抽象原型類具體化的原型類的對象都可以根據(jù)客戶端的需要創(chuàng)建出一個復(fù)制體,這些具體化的原型類都需要實(shí)現(xiàn)抽象原型類的clone方法。在IOS里面,抽象原型類一般指協(xié)議(delegate),該協(xié)議聲明了一個必須實(shí)現(xiàn)的clone接口,而那些具體化的原型類則是實(shí)現(xiàn)了該協(xié)議的類。使用該種方法創(chuàng)建對象的主要應(yīng)用場所是:創(chuàng)建的對象比較復(fù)雜。(通過原型復(fù)制,使得封裝簡單化)需要根據(jù)現(xiàn)有的原型自定義化自己的對象。(比如原型是一件白色衣服,自定義的則是黑色等其他衣服,通過復(fù)制修改后即可實(shí)現(xiàn))
代碼示例
抽象原型是一個鼠標(biāo)頁面,定義如下:
#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)原型是一個藍(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對應(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)對象的深拷貝,以及原型接口clone,給鼠標(biāo)賦予對應(yīng)的顏色,
電腦資料
《原型模式(Prototype)》(http://www.shangyepx.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);先構(gòu)建一個對象,該對象的顏色是黑色的,但是通過原型接口clone出得對象是藍(lán)色的,輸出結(jié)果如下:
可以發(fā)現(xiàn)三個對象的地址都不一樣的,表示都是不同的對象,顏色值mouse和mouse1不同,但是mouse1和mouse2相同的。
總結(jié)
這個原型設(shè)計(jì)模式好像其實(shí)就是一個深復(fù)制+自定義,其他未詳,以后以后想明白了再來補(bǔ)充。