对象的克隆——原型模式(二)

7.3 完整解决方案

Sunny公司开发人员决定使用原型模式来实现工作周报的快速创建,快速创建工作周报结构图如图7-3所示:

对象的克隆——原型模式(二) - 图1

图7-3 快速创建工作周报结构图

在图7-3中,WeeklyLog充当具体原型类,Object类充当抽象原型类,clone()方法为原型方法。WeeklyLog类的代码如下所示:

  1. //工作周报WeeklyLog:具体原型类,考虑到代码的可读性和易理解性,只列出部分与模式相关的核心代码
  2. class WeeklyLog implements Cloneable
  3. {
  4. private String name;
  5. private String date;
  6. private String content;
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public void setDate(String date) {
  11. this.date = date;
  12. }
  13. public void setContent(String content) {
  14. this.content = content;
  15. }
  16. public String getName() {
  17. return (this.name);
  18. }
  19. public String getDate() {
  20. return (this.date);
  21. }
  22. public String getContent() {
  23. return (this.content);
  24. }
  25. //克隆方法clone(),此处使用Java语言提供的克隆机制
  26. public WeeklyLog clone()
  27. {
  28. Object obj = null;
  29. try
  30. {
  31. obj = super.clone();
  32. return (WeeklyLog)obj;
  33. }
  34. catch(CloneNotSupportedException e)
  35. {
  36. System.out.println("不支持复制!");
  37. return null;
  38. }
  39. }
  40. }

编写如下客户端测试代码:

  1. class Client
  2. {
  3. public static void main(String args[])
  4. {
  5. WeeklyLog log_previous = new WeeklyLog(); //创建原型对象
  6. log_previous.setName("张无忌");
  7. log_previous.setDate("第12周");
  8. log_previous.setContent("这周工作很忙,每天加班!");
  9. System.out.println("****周报****");
  10. System.out.println("周次:" + log_previous.getDate());
  11. System.out.println("姓名:" + log_previous.getName());
  12. System.out.println("内容:" + log_previous.getContent());
  13. System.out.println("--------------------------------");
  14. WeeklyLog log_new;
  15. log_new = log_previous.clone(); //调用克隆方法创建克隆对象
  16. log_new.setDate("第13周");
  17. System.out.println("****周报****");
  18. System.out.println("周次:" + log_new.getDate());
  19. System.out.println("姓名:" + log_new.getName());
  20. System.out.println("内容:" + log_new.getContent());
  21. }
  22. }

编译并运行程序,输出结果如下:

  1. ****周报****
  2. 周次:第12
  3. 姓名:张无忌
  4. 内容:这周工作很忙,每天加班!
  5. --------------------------------
  6. ****周报****
  7. 周次:第13
  8. 姓名:张无忌
  9. 内容:这周工作很忙,每天加班!

通过已创建的工作周报可以快速创建新的周报,然后再根据需要修改周报,无须再从头开始创建。原型模式为工作流系统中任务单的快速生成提供了一种解决方案。

思考

如果在Client类的main()函数中增加如下几条语句:

  1. System.out.println(log_previous == log_new);
  2. System.out.println(log_previous.getDate() == log_new.getDate());
  3. System.out.println(log_previous.getName() == log_new.getName());
  4. System.out.println(log_previous.getContent() == log_new.getContent());

预测这些语句的输出结果。