设计模式学习笔记之原型模式

  |   0 评论   |   0 浏览

前言

这是一篇学习笔记,内容很多是来源于网上的资料,按照自己学习情况进行的总结。
我的个人博客:海加尔金鹰

什么是原型模式

原型模式:通过已有的实例对象进行复制来创建新的相同对象。
特点:

  • 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]

应用场景

  1. 创建新对象成本比较大。
  2. 一个对象有多个修改人。
  3. 对对象的状态进行记录。

这周过的心惊胆战啊,地震很吓人啊。
[^1]:设计模式原型模式:https://www.cnblogs.com/songyaqi/p/PrototypePattern.html
[^2]:浅克隆和深克隆的区别:https://blog.csdn.net/jeffleo/article/details/76737560
[^3]:Java设计模式之原型模式的优点及缺点讲解:https://www.2cto.com/kf/201802/717717.html


标题:设计模式学习笔记之原型模式
作者:hjljy
地址:https://www.hjljy.cn/articles/2019/06/23/1561303942365.html