临沂专业网站制作,秦洁婷seo博客,低价建设网站,建设网站什么语言文章目录 概述克隆羊问题传统方式解决克隆羊问题传统的方式的优缺点原型模式原理结构图-uml 类图原理结构图说明 原型模式解决克隆羊问题的应用实例原型模式在Spring框架中的应用深入讨论-浅拷贝和深拷贝浅拷贝的介绍深拷贝基本介绍深拷贝应用实例注意事项 概述
原型模式… 文章目录 概述克隆羊问题传统方式解决克隆羊问题传统的方式的优缺点原型模式原理结构图-uml 类图原理结构图说明 原型模式解决克隆羊问题的应用实例原型模式在Spring框架中的应用深入讨论-浅拷贝和深拷贝浅拷贝的介绍深拷贝基本介绍深拷贝应用实例注意事项 概述
原型模式Prototype Pattern是一种创建型设计模式旨在通过复制现有对象来创建新对象而无需显式地使用构造函数。这种模式允许我们创建一个原型对象然后通过克隆这个原型来生成新的对象实例从而避免了重复创建相似对象的开销。
原型模式的主要思想是通过复制现有对象的状态来创建新对象而不是从头开始重新构建对象。这对于某些对象的创建过程较为复杂或者需要保持一致的初始状态时是一种很有用的模式。
形象的理解孙悟空拔出猴毛 变出其它孙悟空
克隆羊问题
现在有一只羊 tom姓名为: tom, 年龄为1颜色为白色请编写程序创建和 tom 羊 属性完全相同的 10 只羊。
传统方式解决克隆羊问题 bean类 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/Sheep.java
客户端 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/Client.java
传统的方式的优缺点
优点是比较好理解简单易操作。在创建新的对象时总是需要重新获取原始对象的属性如果创建的对象比较复杂时效率较低总是需要重新初始化对象而不是动态地获得对象运行时的状态, 不够灵活改进的思路分析 思路Java 中 Object 类是所有类的根类Object 类提供了一个 clone()方法该方法可以将一个 Java 对象复制一份但是需要实现 clone 的 Java 类必须要实现一个接口 Cloneable该接口表示该类能够复制且具有复制的能力 原型模式
原型模式原理结构图-uml 类图 原理结构图说明
Prototype : 原型类声明一个克隆自己的接口ConcretePrototype: 具体的原型类, 实现一个克隆自己的操作Client: 让一个原型对象克隆自己从而创建一个新的对象(属性一样
原型模式解决克隆羊问题的应用实例
使用原型模式改进传统方式让程序具有更高的效率和扩展性。
bean类 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/improve/Sheep.java
客户端 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/improve/Client.java
原型模式在Spring框架中的应用
Spring 中原型 bean 的创建就是原型模式的应用debug分析 上述四个图均为Spring框架中底层的原型模式细节
深入讨论-浅拷贝和深拷贝
浅拷贝的介绍 对于数据类型是基本数据类型的成员变量浅拷贝会直接进行值传递也就是将该属性值复制一份给新的对象。 对于数据类型是引用数据类型的成员变量比如说成员变量是某个数组、某个类的对象等那么浅拷贝会进行引用传递也就是只是将该成员变量的引用值内存地址复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下在一个对象中修改该成员变量会影响到另一个对象的该成员变量值 前面我们克隆羊就是浅拷贝 浅拷贝是使用默认的 clone()方法来实现 sheep (Sheep) super.clone();
深拷贝基本介绍
复制对象的所有基本数据类型的成员变量值为所有引用数据类型的成员变量申请存储空间并复制每个引用数据类型成员变量所引用的对象直到该对象可达的所有对象。也就是说对象进行深拷贝要对整个对象(包括对象的引用类型)进行拷贝深拷贝实现方式 1重写 clone 方法来实现深拷贝深拷贝实现方式 2通过对象序列化实现深拷贝(推荐)
深拷贝应用实例
使用 重写 clone 方法实现深拷贝使用序列化来实现深拷贝代码演示
代码案例1 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/deepclone/DeepCloneableTarget.java
代码案例2 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/deepclone/DeepProtoType.java
客户端 https://gitee.com/luan_hao/design-pattern/blob/master/src/main/java/com/lh/prototype/deepclone/Client.java
原型模式的深拷贝会将对象的所有属性值进行拷贝并将拷贝的值放入新的内存地址中从而创建一个完全独立的新对象原对象和新对象之间不共享任何引用关系。这样做的目的是为了创建一个与原对象相似但完全独立的对象使得对新对象的修改不会影响原对象反之亦然。
深拷贝的实现方式通常涉及递归地遍历对象的属性对每个属性值进行拷贝并确保拷贝的属性值也是深拷贝。这可以确保对象中的所有嵌套属性都得到正确地复制。
注意事项
需要注意的是深拷贝可能会涉及到一些性能和复杂性方面的考虑特别是当对象的结构很复杂包含循环引用或大量数据时。在实际使用中可以选择使用不同的深拷贝实现方法例如递归拷贝、序列化和反序列化或者使用专门的深拷贝库来处理这些情况。
创建新的对象比较复杂时可以利用原型模式简化对象的创建过程同时也能够提高效率不用重新初始化对象而是动态地获得对象运行时的状态如果原始对象发生变化(增加或者减少属性)其它克隆对象的也会发生相应的变化无需修改代码在实现深克隆的时候可能需要比较复杂的代码缺点需要为每一个类配备一个克隆方法这对全新的类来说不是很难但对已有的类进行改造时需要修改 其源代码违背了 ocp 原则这点请大家注意.