前言
这是一篇学习笔记,内容很多是来源于网上的资料,按照自己学习情况进行的总结。
我的个人博客:海加尔金鹰
什么是原型模式
原型模式:通过已有的实例对象进行复制来创建新的相同对象。
特点:
- 1 必须已经有一个实例对象存在。
- 2 通过原型模式创建的对象避免了构造器的约束,即不会调用构造器。
- 3 通过原型模式创建的对象和原始的对象属性值是一样的。
原型模式的实现
核心结构
(1)Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,它可是抽象类也可以是接口,甚至可以是具体实现类。
(2)ConcretePrototype(具体原型类):它实现抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
(3)Client(客户端):在客户类中,让一个原型对象克隆自身从而创建一个新的对象。1
核心代码
1 实现 Cloneable 接口
2 clone()方法 在 java 当中 Object 类种就有 clone()方法
浅克隆和深克隆
浅克隆:当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制。
深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将被复制。1
深克隆与浅克隆的区别就是,浅克隆不会克隆原对象中的引用类型,仅仅拷贝了引用类型的指向。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响。2
具体实现代码及相关验证:见末尾网上资料
原型模式的优缺点及应用场景
优缺点
优点:
(1):提高性能,简洁代码。
(2):避免了构造器的约束。
注:查找资料时看到还有一些其他的优点,但是这两点给我最直观的感受。
缺点:
(1):需要为每一个类配置一个克隆方法,而且该克隆方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违反了开闭原则。1
(2):在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重签到引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。1
(3):由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用。3
应用场景
- 创建新对象成本比较大。
- 一个对象有多个修改人。
- 对对象的状态进行记录。
这周过的心惊胆战啊,地震很吓人啊。
设计模式原型模式:https://www.cnblogs.com/songyaqi/p/PrototypePattern.html ↩ ↩ ↩ ↩
浅克隆和深克隆的区别:https://blog.csdn.net/jeffleo/article/details/76737560 ↩
Java 设计模式之原型模式的优点及缺点讲解:https://www.2cto.com/kf/201802/717717.html ↩
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于