设计模式7之原型模式( 二 )


PrototypeTest
设计模式7之原型模式文章插图
测试结果:
具体原型创建成功!具体原型复制成功!obj1==obj2?false原型模式的实现其实很简单 , 只要调用clone()方法就可以实现属性复制 。
关于原型模式的思考使用原型模式性能优良 , 在原型模式中 , 对象不直接new出来 , 通过在内存中拷贝已有对象 , 如果你在循环中需要产生大量对象 , 就可以使用原型模式 。
其实有很多地方都使用了原型模式哦 。
在Spring中 , 原型模式应用的非常广泛 , 例如 scope='prototype'、JSON.parseObject() 等都是原型模式的具体应用 。
相信你肯定用过BeanUtils.copyProperties作实体拷贝 , 其实这个拷贝也是浅拷贝 。
关于浅拷贝你需要注意的我们知道 , 浅拷贝会共用同一个地址 , 如果一个对象的属性(引用类型)值改变 , 另一个对象的值也会相应改变 。 两个对象共享了一个私有变量 , 你改我改大家都能改 , 是一种非常不安全的方式 , 在实际项目中使用还是比较少的(当然 ,这也是一种“危机”环境的一种救命方式)
我们用代码来说明一下问题:
设计模式7之原型模式文章插图
浅拷贝问题
我们创建一个用来拷贝的类Citation
设计模式7之原型模式文章插图
测试代码
设计模式7之原型模式文章插图
直接来看看结果:
设计模式7之原型模式文章插图

如果obj2中的Member内容变了 , obj1中的Member内容会不会变?

这个问题的答案是会改变 。
【设计模式7之原型模式】所以在使用clone()拷贝对象时要注意这个问题 。


推荐阅读