原型模式(Prototype Pattern)

一、概念

 我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),当直接创建对象的代价比较大时,我们可以采用原型模式(Prototype Pattern)。通过克隆已存在的对象,减少重新创建对象的时间开销

原型模式也称为"克隆模式", 即某个对象为原型克隆出来一个一模一样的对象,该对象的属性和原型对象一模一样。而且对于原型对象没有任何影响。原型模式的克隆方式有2种:浅克隆和深度克隆

二、参与者

  • 抽象原型角色(Abstract Prototype):这是一个抽象角色,此抽象角色规定了所有的具体原型类所需的接口
  • 具体原型角色(Concrete Prototype):即被复制的对象,此角色需要实现抽象的原型角色所要求的接口
  • 客户角色(Client):使用原型对象的客户程序。让一个原型克隆自生从而创建一个新的对象

三、代码例子

 生成 BMW320 和 BenZ520

再拷贝生成 新的 BMW320 和 BenZ520

抽象原型角色(Abstract Prototype):Prototype

具体原型角色(Concrete Prototype):PrototypeBMW320 和 PrototypeBenZ520

四、UML图

 

五、浅克隆和深克隆

  • 浅克隆:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
  • 深克隆:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深克隆进行了完全彻底的复制,而浅克隆不彻底。
  • 无论是深克隆还是、浅克隆在没有经过处理时,都会破坏单例模式,重新生成一个新的实例

六、原型模式适用场景

  1. 在需要一个类的大量对象的时候,使用原型模式是最佳选择,因为原型模式是在内存中对这个对象进行拷贝,要比直接new这个对象性能要好很多。
  2. 如果一个对象的初始化需要很多其他对象的数据准备或其他资源的繁琐计算,那么可以使用原型模式,这样创建新的对象的时候,可以避免其他对象的数据准备和计算,直接得到当前对象的副本
  3. 当需要保留一个复杂对象的绝大部分信息,少量字段进行个性化设置的时候,也可以使用原型模式拷贝出现有对象的副本后再进行加工处理。

七、优缺点

(一)优点

  • 减少了重新创建实例、反复的相同赋值操作的性能开销;
  • 原型模式是在内存二进制流的拷贝, 要比直接new一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时

(二)缺点

  • 克隆包含循环引用的复杂对象会非常麻烦,需要编写较为复杂的代码
posted @ 2022-12-05 20:50  ImreW  阅读(8)  评论(0编辑  收藏  举报