版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系我們

[科普中國(guó)]-原型模式

科學(xué)百科
原創(chuàng)
科學(xué)百科為用戶提供權(quán)威科普內(nèi)容,打造知識(shí)科普陣地
收藏

用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。

定義原型模式是一種創(chuàng)建型設(shè)計(jì)模式,Prototype模式允許一個(gè)對(duì)象再創(chuàng)建另外一個(gè)可定制的對(duì)象,根本無需知道任何如何創(chuàng)建的細(xì)節(jié),工作原理是:通過將一個(gè)原型對(duì)象傳給那個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象,這個(gè)要發(fā)動(dòng)創(chuàng)建的對(duì)象通過請(qǐng)求原型對(duì)象拷貝它們自己來實(shí)施創(chuàng)建。1

解決問題它主要面對(duì)的問題是:“某些結(jié)構(gòu)復(fù)雜的對(duì)象”的創(chuàng)建工作;由于需求的變化,這些對(duì)象經(jīng)常面臨著劇烈的變化,但是他們卻擁有比較穩(wěn)定一致的接口。2

如何使用因?yàn)镴ava中的提供clone()方法來實(shí)現(xiàn)對(duì)象的克隆,所以Prototype模式實(shí)現(xiàn)一下子變得很簡(jiǎn)單。

以勺子為例:

public abstract class AbstractSpoon implements Cloneable{String spoonName;public void setSpoonName(String spoonName) {this.spoonName = spoonName;}public String getSpoonName() {return this.spoonName;}public Object clone(){Object object = null;try {object = super.clone();} catch (CloneNotSupportedException exception) {System.err.println("AbstractSpoon is not Cloneable");}return object;}}有兩個(gè)具體實(shí)現(xiàn)(ConcretePrototype):public class SoupSpoon extends AbstractSpoon{public SoupSpoon(){setSpoonName("Soup Spoon");}}調(diào)用Prototype模式很簡(jiǎn)單:

AbstractSpoon spoon = new SoupSpoon();AbstractSpoon spoon = new SaladSpoon();當(dāng)然也可以結(jié)合工廠模式來創(chuàng)建AbstractSpoon實(shí)例。

在Java中Prototype模式變成clone()方法的使用,由于Java的純潔的面向?qū)ο筇匦?,使得在Java中使用設(shè)計(jì)模式變得很自然,兩者已經(jīng)幾乎是渾然一體了。這反映在很多模式上,如Iterator遍歷模式。

帶Prototype Manager的原型模式:客戶(Client)角色:客戶端類向原型管理器提出創(chuàng)建對(duì)象的請(qǐng)求。

抽象原型(Prototype)角色:這是一個(gè)抽象角色,通常由一個(gè)C#接口或抽象類實(shí)現(xiàn)。此角色給出所有的具體原型類所需的接口。在C#中,抽象原型角色通常實(shí)現(xiàn)了ICloneable接口。

具體原型(Concrete Prototype)角色:被復(fù)制的對(duì)象。此角色需要實(shí)現(xiàn)抽象的原型角色所要求的接口。

原型管理器(Prototype Manager)角色:創(chuàng)建具體原型類的對(duì)象,并記錄每一個(gè)被創(chuàng)建的對(duì)象。1

代碼實(shí)現(xiàn)如下:

/ CplusplusPrototype.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include#include#includeusingnamespace std;//父類class Resume{protected:char *name;public:Resume() {}virtual ~Resume() {}virtual Resume* Clone() { return NULL; }virtualvoid Set(char *n) {}virtualvoid Show() {}};class ResumeA : public Resume{public:ResumeA(constchar *str); //構(gòu)造函數(shù)ResumeA(const ResumeA &r); //拷貝構(gòu)造函數(shù)~ResumeA(); //析構(gòu)函數(shù)ResumeA* Clone(); //克隆,關(guān)鍵所在void Show(); //顯示內(nèi)容};ResumeA::ResumeA(constchar *str){if(str == NULL) {name = newchar[1];name[0] = '\0';}else {name = newchar[strlen(str)+1];strcpy(name, str);}}ResumeA::~ResumeA() { delete [] name;}ResumeA::ResumeA(const ResumeA &r) {name = newchar[strlen(r.name)+1];strcpy(name, r.name);}ResumeA* ResumeA::Clone() {returnnew ResumeA(*this);}void ResumeA::Show() {coutShow();delete r3; delete r4;r3 = r4 = NULL;return 0;}本詞條內(nèi)容貢獻(xiàn)者為:

曹慧慧 - 副教授 - 中國(guó)礦業(yè)大學(xué)