spring5 核心原理-学习 -原型模式

内容都是从Tom老师的书中摘抄,记录下来方便自己学习。
原型模式(Prototype Pattern) 是指原型实例指定创建对象的种类,并且通过赋值这些原型创建新的对象。
适用场景:

  1. 类初始化消耗资源较多;
  2. 适用new生成一个对象需要非常繁琐的过程(数据准备、访问权限等);
  3. 构造函数比较复杂;
  4. 在循环体中产生大量对象。
public class Monkey {
    public  int height;
    public  int weight;
    public Date birthday;
}
public class JinGuBang implements Serializable {
    public float h=100f;
    public float d=10f;
    public  void big(){
        this.d *=2;
        this.h *=2;
    }
    public  void small(){
        this.d /=2;
        this.h /=2;
    }
}
public class QiTianDASheng extends  Monkey implements  Cloneable, Serializable {
    public  JinGuBang jinGuBang;

    public QiTianDASheng() {
      this.birthday=new Date();
      this.jinGuBang=new JinGuBang();
    }
    @Override
    protected Object clone() throws CloneNotSupportedException{
        return  this.deepClone();
    }
    public Object deepClone(){
        try {
            ByteArrayOutputStream bos=new ByteArrayOutputStream();
            ObjectOutputStream oos=new ObjectOutputStream(bos);
            oos.writeObject(this);
            ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois=new ObjectInputStream(bis);
            QiTianDASheng copy= (QiTianDASheng) ois.readObject();
            copy.birthday=new Date();
            return copy;
        }catch (Exception e){
            e.printStackTrace();
            return  null;
        }

    }
    public  Object shallowClone(QiTianDASheng target){
        QiTianDASheng qiTianDASheng=new QiTianDASheng();
        qiTianDASheng.height=target.height;
        qiTianDASheng.weight=target.weight;
        qiTianDASheng.jinGuBang=target.jinGuBang;
        qiTianDASheng.birthday=new Date();
        return  qiTianDASheng;
    }
}
public class DeepCloneTest {
    public static void main(String[] args) {
        QiTianDASheng qiTianDASheng=new QiTianDASheng();
        try {
            QiTianDASheng clone= (QiTianDASheng) qiTianDASheng.clone();
            System.out.println("深克隆:"+(qiTianDASheng.jinGuBang==clone.jinGuBang));

        }catch (Exception e){
            e.printStackTrace();
        }
        QiTianDASheng qi=new QiTianDASheng();
        QiTianDASheng n= (QiTianDASheng) qi.shallowClone(qi);
        System.out.println("浅克隆:"+(qi.jinGuBang==n.jinGuBang));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值