物件的克隆——原型模式(二)

Liuwei-Sunny發表於2012-04-03

7.3 完整解決方案

      Sunny公司開發人員決定使用原型模式來實現工作週報的快速建立,快速建立工作週報結構圖如圖7-3所示:

7-3 快速建立工作週報結構圖

      在圖7-3中,WeeklyLog充當具體原型類,Object類充當抽象原型類,clone()方法為原型方法。WeeklyLog類的程式碼如下所示:

//工作週報WeeklyLog:具體原型類,考慮到程式碼的可讀性和易理解性,只列出部分與模式相關的核心程式碼

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語言提供的克隆機制

       public WeeklyLog clone()

       {

              Object obj = null;

              try

              {

                     obj = super.clone();

                     return (WeeklyLog)obj;     

              }

              catch(CloneNotSupportedException e)

              {

                     System.out.println("不支援複製!");

                     return null;

              }

       }

}

編寫如下客戶端測試程式碼:

class Client

{

       public  static void main(String args[])

       {

              WeeklyLog log_previous = new WeeklyLog();  //建立原型物件

              log_previous.setName("張無忌");

              log_previous.setDate("12");

              log_previous.setContent("這周工作很忙,每天加班!");

             

              System.out.println("****週報****");

              System.out.println("周次:" +  log_previous.getDate());

              System.out.println("姓名:" +  log_previous.getName());

              System.out.println("內容:" +  log_previous.getContent());

              System.out.println("--------------------------------");

             

              WeeklyLog  log_new;

              log_new  = log_previous.clone(); //呼叫克隆方法建立克隆物件

              log_new.setDate("13");

              System.out.println("****週報****");

              System.out.println("周次:" + log_new.getDate());

              System.out.println("姓名:" + log_new.getName());

              System.out.println("內容:" + log_new.getContent());

       }

}

      編譯並執行程式,輸出結果如下:

****週報****

周次:第12

姓名:張無忌

內容:這周工作很忙,每天加班!

--------------------------------

****週報****

周次:第13

姓名:張無忌

內容:這周工作很忙,每天加班!

      通過已建立的工作週報可以快速建立新的週報,然後再根據需要修改週報,無須再從頭開始建立。原型模式為工作流系統中任務單的快速生成提供了一種解決方案。

 

思考

如果在Client類的main()函式中增加如下幾條語句:

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());

預測這些語句的輸出結果。

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章