Java设计模式-7、原型模式-克隆对象(深浅克隆)

第7章:原型模式-克隆对象

定义:

在使用原型模式时,我们需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。

通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,

在Java中可以直接使用Object提供的**clone()**方法来实现对象的克隆,

能够实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持被复制。如果一个类没实现这个接口但是调用了clone()方法,Java编译器将抛出一个CloneNotSupportedException异常

Java语言中的clone()方法满足:
  1. 对任何对象x,都x.clone() != x,即克隆对象与原型对象不是同一个对象;
  2. 对任何对象x,都x.clone().getClass() == x.getClass(),即克隆对象与原型对象的类型一
    样;
  3. 如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
直接利用Object类的clone()方法,具体步骤:
  1. 在派生类中覆盖基类的clone()方法,并声明为public;
  2. 在派生类的clone()方法中,调用super.clone();
  3. 派生类需实现Cloneable接口。
    此时,Object类相当于抽象原型类,所实现了Cloneable接口的类相当于具体原型类。

例如:孙悟空拔猴毛,ctrl+c/ctrl+v

结构:

代码实现:

应用实例:

image-20201031182707920

image-20201031182716460

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.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值