鍍金池/ 教程/ Java/ 對(duì)象的克隆——原型模式(二)
工廠(chǎng)三兄弟之抽象工廠(chǎng)模式(五)
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(一)
工廠(chǎng)三兄弟之工廠(chǎng)方法模式(一)
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(二)
確保對(duì)象的唯一性——單例模式 (二)
工廠(chǎng)三兄弟之簡(jiǎn)單工廠(chǎng)模式(四)
確保對(duì)象的唯一性——單例模式 (一)
工廠(chǎng)三兄弟之工廠(chǎng)方法模式(四)
對(duì)象的克隆——原型模式(一)
工廠(chǎng)三兄弟之抽象工廠(chǎng)模式(二)
工廠(chǎng)三兄弟之工廠(chǎng)方法模式(三)
工廠(chǎng)三兄弟之抽象工廠(chǎng)模式(一)
工廠(chǎng)三兄弟之抽象工廠(chǎng)模式(四)
確保對(duì)象的唯一性——單例模式 (三)
工廠(chǎng)三兄弟之簡(jiǎn)單工廠(chǎng)模式(三)
對(duì)象的克隆——原型模式(二)
復(fù)雜對(duì)象的組裝與創(chuàng)建——建造者模式(三)
對(duì)象的克隆——原型模式(四)
確保對(duì)象的唯一性——單例模式(四)
工廠(chǎng)三兄弟之簡(jiǎn)單工廠(chǎng)模式(一)
工廠(chǎng)三兄弟之簡(jiǎn)單工廠(chǎng)模式(二)
對(duì)象的克隆——原型模式(三)
工廠(chǎng)三兄弟之抽象工廠(chǎng)模式(三)
確保對(duì)象的唯一性——單例模式(五)
工廠(chǎng)三兄弟之工廠(chǎng)方法模式(二)

對(duì)象的克隆——原型模式(二)

完整解決方案

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é)果。