码迷,mamicode.com
首页 > 其他好文 > 详细

原型模式(Prototype Pattern)

时间:2020-12-03 12:31:08      阅读:17      评论:0      收藏:0      [点我收藏+]

标签:image   关注   复制   原型   array   直接   integer   浅复制   new   

原型模式:使用克隆技术复制创建复杂的或者构造耗时的实例,被复制的对象就是所谓的“原型”。
技术图片

应用场景

  • a、类初始化需要消耗非常多的资源,包括数据库、硬件资源等,使用拷贝可避免这些消耗
  • b、new产生的对象需要非常繁琐的数据准备或权限
  • c、Spring框架中的多例就是使用原型

如何实现

  • (1)实现Cloneable接口,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • (2)重写Object类中的clone方法。Object类中的clone方法是protected类型,Prototype类需要将clone方法的作用域修改为public类型

浅拷贝与深拷贝

浅复制:只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”。
换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。
深复制:在计算机中开辟了一块新的内存地址用于存放复制的对象。

原型模式的核心代码及效果

/**默认是浅克隆,基本类型和封装类型(int、Integer、String)等都会被克隆,但引用类型ArrayList只是地址被复制,不会开辟新的空间
* 打印结果:
* book1原始数据showBook():
* {"age":22,"image":["图1"],"num":2,"title":"书1"}
* book2直接克隆后showBook():
* {"age":22,"image":["图1"],"num":2,"title":"书1"}
* book2修改数据后showBook():
* {"age":33,"image":["图1","圖2"],"num":3,"title":"书2"}
* book1被克隆数据showBook():
* {"age":22,"image":["图1","圖2"],"num":2,"title":"书1"}
*/
Book book = (Book) super.clone();
/**
* 下面开启深复制后的打印结果:
* book1原始数据showBook():
* {"age":22,"image":["图1"],"num":2,"title":"书1"}
* book2直接克隆后showBook():
* {"age":22,"image":["图1"],"num":2,"title":"书1"}
* book2修改数据后showBook():
* {"age":33,"image":["图1","圖2"],"num":3,"title":"书2"}
* book1被克隆数据showBook():
* {"age":22,"image":["图1"],"num":2,"title":"书1"}
*/
book.image=(ArrayList<String>)this.image.clone();

更多文章请关注[迦叶主站]http://jarye.cn

原型模式(Prototype Pattern)

标签:image   关注   复制   原型   array   直接   integer   浅复制   new   

原文地址:https://www.cnblogs.com/jarye/p/14057476.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!