Sunny 公司開(kāi)發(fā)人員決定使用原型模式來(lái)實(shí)現(xiàn)工作周報(bào)的快速創(chuàng)建,快速創(chuàng)建工作周報(bào)結(jié)構(gòu)圖如圖7-3所示:
http://wiki.jikexueyuan.com/project/design-pattern-creation/images/1333464523_7039.gif" alt="快速創(chuàng)建工作周報(bào)結(jié)構(gòu)圖" />
在圖中,WeeklyLog 充當(dāng)具體原型類(lèi),Object 類(lèi)充當(dāng)抽象原型類(lèi),clone() 方法為原型方法。WeeklyLog 類(lèi)的代碼如下所示:
//工作周報(bào)WeeklyLog:具體原型類(lèi),考慮到代碼的可讀性和易理解性,只列出部分與模式相關(guān)的核心代碼
class WeeklyLog implements Cloneable
{
private String name;
private String date;
private String content;
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
public void setContent(String content) {
this.content = content;
}
public String getName() {
return (this.name);
}
public String getDate() {
return (this.date);
}
public String getContent() {
return (this.content);
}
//克隆方法clone(),此處使用Java語(yǔ)言提供的克隆機(jī)制
public WeeklyLog clone()
{
Object obj = null;
try
{
obj = super.clone();
return (WeeklyLog)obj;
}
catch(CloneNotSupportedException e)
{
System.out.println("不支持復(fù)制!");
return null;
}
}
}
編寫(xiě)如下客戶(hù)端測(cè)試代碼:
class Client
{
public static void main(String args[])
{
WeeklyLog log_previous = new WeeklyLog(); //創(chuàng)建原型對(duì)象
log_previous.setName("張無(wú)忌");
log_previous.setDate("第12周");
log_previous.setContent("這周工作很忙,每天加班!");
System.out.println("****周報(bào)****");
System.out.println("周次:" + log_previous.getDate());
System.out.println("姓名:" + log_previous.getName());
System.out.println("內(nèi)容:" + log_previous.getContent());
System.out.println("--------------------------------");
WeeklyLog log_new;
log_new = log_previous.clone(); //調(diào)用克隆方法創(chuàng)建克隆對(duì)象
log_new.setDate("第13周");
System.out.println("****周報(bào)****");
System.out.println("周次:" + log_new.getDate());
System.out.println("姓名:" + log_new.getName());
System.out.println("內(nèi)容:" + log_new.getContent());
}
}
編譯并運(yùn)行程序,輸出結(jié)果如下:
****周報(bào)****
周次:第12周
姓名:張無(wú)忌
內(nèi)容:這周工作很忙,每天加班!
--------------------------------
****周報(bào)****
周次:第13周
姓名:張無(wú)忌
內(nèi)容:這周工作很忙,每天加班!
通過(guò)已創(chuàng)建的工作周報(bào)可以快速創(chuàng)建新的周報(bào),然后再根據(jù)需要修改周報(bào),無(wú)須再?gòu)念^開(kāi)始創(chuàng)建。原型模式為工作流系統(tǒng)中任務(wù)單的快速生成提供了一種解決方案。
如果在 Client 類(lèi)的 main() 函數(shù)中增加如下幾條語(yǔ)句:
System.out.println(log_previous == log_new);
System.out.println(log_previous.getDate() == log_new.getDate());
System.out.println(log_previous.getName() == log_new.getName());
System.out.println(log_previous.getContent() == log_new.getContent());
預(yù)測(cè)這些語(yǔ)句的輸出結(jié)果。