原型模式(克隆模式):浅谈浅克隆与深克隆

原型模式(克隆模式):浅谈浅克隆与深克隆

克隆是什么?它的产生背景?

当new的对象是多例的时候,new对象将会不断占据内存。特别是消耗内存的大对象,比如数据库连接等。平时运用的不多,只在spring等容器有见过,此处不多赘述,了解即可。

浅克隆与深克隆是什么意思?通过案例逐步探讨。

public class Star implements Cloneable,Serializable{
    private String name;
    private Date birthday;
    
    public Star(){}
    public Star(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }

    //实现浅克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

}
明星实体类-浅克隆
 1 public class Client {
 2     public static void main(String[] args) throws CloneNotSupportedException {
 3         Date date=new Date(1346545646556465131L);
 4         //new一个明星:杨洋
 5         Star  yangYang=new Star("杨洋",date);
 6         System.out.println(yangYang);
 7         System.out.println(yangYang.getName());
 8         System.out.println(yangYang.getBirthday());
 9         
10         date.setTime(4685456456456465465L);
11         System.out.println(yangYang.getBirthday());
12         
13         //克隆杨洋:满足你当明星的梦
14         Star me=(Star) yangYang.clone();
15         System.out.println(me);
16         me.setName("周杰伦");
17         System.out.println(me.getName());
18         System.out.println(me.getBirthday());    
19     }
20 }

问题:我们发现,当date改变的时候,克隆对象的date也随之改变。这个不难理解,因为原型对象改变,克隆对象也随之改变,克隆对象只是克隆了star对象,并没有去克隆star对象中的birthday对象。

结论:浅克隆就是克隆对象直接引用原型对象。

public class Star2 implements Cloneable{
    private String name;
    private Date birthday;
    
    public Star2(){}
    public Star2(String name, Date birthday) {
        super();
        this.name = name;
        this.birthday = birthday;
    }
    //实现深克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj= super.clone();
        
        Star2 s=(Star2)obj;
        s.birthday=(Date) this.birthday.clone();
        return obj;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

}
明星实体类-深克隆
 1 public class Client2 {
 2     public static void main(String[] args) throws CloneNotSupportedException {
 3         Date date=new Date(1346545646556465131L);
 4         //new一个明星:杨洋
 5         Star2  yangYang=new Star2("杨洋",date);
 6         Star2 me=(Star2) yangYang.clone();//深克隆里面的birthday对象是一个新对象
 7         
 8         System.out.println(yangYang);
 9         System.out.println(yangYang.getName());
10         System.out.println(yangYang.getBirthday());
11         
12         date.setTime(4685456456456465465L);
13         System.out.println(yangYang.getBirthday());
14         
15         
16         System.out.println(me);
17         me.setName("周杰伦");
18         System.out.println(me.getName());
19         System.out.println(me.getBirthday());        
20     }
21 }

 

问题:我们发现,当date改变的时候,克隆对象的bitthday并没有随之改变。通过实体类可知,当克隆对象的时候,随之也去克隆了实体类里面的引用对象,即克隆对象的birthday是一个new的对象。

结论:深克隆就是递归克隆出原型对象里的所有引用对象。

posted @ 2017-05-29 14:22 邱勇Aries 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值