第7章:原型模式-克隆对象
定义:
在使用原型模式时,我们需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。
通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,
在Java中可以直接使用Object提供的**clone()**方法来实现对象的克隆,
能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持被复制。如果一个类没实现这个接口但是调用了clone()方法,Java编译器将抛出一个CloneNotSupportedException异常
Java语言中的clone()方法满足:
- 对任何对象x,都x.clone() != x,即克隆对象与原型对象不是同一个对象;
- 对任何对象x,都x.clone().getClass() == x.getClass(),即克隆对象与原型对象的类型一
样; - 如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
直接利用Object类的clone()方法,具体步骤:
- 在派生类中覆盖基类的clone()方法,并声明为public;
- 在派生类的clone()方法中,调用super.clone();
- 派生类需实现Cloneable接口。
此时,Object类相当于抽象原型类,所实现了Cloneable接口的类相当于具体原型类。
例如:孙悟空拔猴毛,ctrl+c/ctrl+v
结构:
代码实现:
应用实例:
class WeeklyLog implements Cloneable {
private String name;
private String date;
private String content;
//get() set()方法
//克隆方法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.