史上最全设计模式——原型模式

参考:

1、史上最全设计模式

2、https://www.cnblogs.com/zhangtianq/p/6006120.html

所谓的原型模式就是就是克隆模式,把原有的对象克隆出一个新的对象,这里克隆有浅克隆和深克隆之分。

浅克隆对于目录对象中的引用类型(比如其它以对象实例、集合等)为共用,改变其中一个都会影响所有克隆出来的对象。

如下图:

原型设计模式结构图如下:

具备原型模式的类所有实现原型类的clone方法,对java来说,Object对象中已有clone方法,子类覆盖即可,同时实现cloneable标识接口。

package com.ztq.prototype;

import java.util.Date;

//浅克隆
@Data
public class Sheep implements Cloneable{
    private String sname;
    private Date birthday;
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone(); //直接调用Object对象的clone()方法
        return obj;
    }
}

上面的浅克隆方法,改变birthday将影响所有克隆出来的对象。

下面是深克隆:

@Override
protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone(); //直接调用Object对象的clone()方法
        
        //添加如下代码实现深复制
        Sheep s = (Sheep)obj;
        s.birthday = (Date)this.birthday.clone();
        
        return obj;
}

 

上面的方式缺点就是如果有太多的引用成员会写很多上面类似的代码,所以更好的方式是使用下面的方式实现深克隆。(采用对象序列化的方式,这里需要注意,序列化的对象需要实现 Serializable 标识接口)

@Override
protected Object clone() throws CloneNotSupportedException {
  ByteArrayOutputStream bos = new ByteArrayOutputStream();
  ObjectOutputStream oos = new ObjectOutputStream(bos);
  oos.writeObject(s1);
        
  ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
  ObjectInputStream ois = new ObjectInputStream(bis);
  return ois.readObject();  //克隆好的对象
}

 

转载于:https://my.oschina.net/u/915967/blog/1648092

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值