Prototype原型模式

定义:

prototype pattern是指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。是一种创建模式。

Prototype原型模式

角色

  • Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
  • ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
  • Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

适用场景:

  1. 资源优化场景—类初始化消耗太多资源,这个资源包括数据、硬件资源等
  2. 构造函数比较复杂
  3. JAVA创建类实例基本上是适用new关键字。有时候需要使用 “在不指定类名的前提下生成实例”的需求。
  4. 对象种类繁多,无法将他们整合到一个类中
  5. 难以根据类生成实例,
  6. 解耦框架和生成的实例
  7. 性能和安全要求的场景–通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
  8. 一个对象多个修改者的场景—一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过clone的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与Java融为浑然一体,大家可以随手拿来使用。

缺点

1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

2、实现原型模式每个派生类都必须实现 Clone接口。

3、逃避构造函数的约束。

一旦在类中使用到了别的类名,就不能和该类分离,也无法实现复用。也就意味着两者是耦合在一起的。

日常框架中的prototype有:Spring中,原型模式应用的非常广泛,scope=’prototype’,还有JSON.parseObject()也是原型模式。

原型模式的核心就是克隆方法

java的Object类的clone方法和java.lang.cloneable接口:clone方法是浅拷贝

浅克隆:

  • 在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。
  • 简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
  • 在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。

深克隆:

  • 在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。
  • 简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。
  • 在Java语言中,如果需要实现深克隆,可以通过序列化(Serialization)等方式来实现。需要注意的是能够实现序列化的对象其类必须实现Serializable接口,否则无法实现序列化操作。

Original: https://www.cnblogs.com/duanxz/p/3664440.html
Author: duanxz
Title: Prototype原型模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546501/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • eclipse反编译插件

    1、在eclipse的help—》Install New Software…中添加新软件开发,添加它的源: undefined name : jd – ec…

    技术杂谈 2023年7月24日
    075
  • 为什么要使用String.intern()

    最近在阅读《深入理解Jav虚拟机》的运行时常量池章节,看到”java语言并不要求常量池一定只有编译器才能产生…运行期间也可以将新的常量放入常量池,这种特性被…

    技术杂谈 2023年7月25日
    073
  • Sololearn All In One

    Sololearn All In One web skills playground https://www.sololearn.com/profile/3476348 Learn…

    技术杂谈 2023年6月1日
    0105
  • 数据校验

    数据校验 element前端自定义校验规则 :rules=”dataRule” 绑定数据校验规则方法 * firstLetter: [ { validato…

    技术杂谈 2023年7月25日
    072
  • HelloWorld

    新的起点,新的征程,未来可期! posted @2022-07-27 10:57 旅程~ 阅读(10 ) 评论() 编辑 Original: https://www.cnblogs…

    技术杂谈 2023年7月24日
    084
  • 让你的app在iPhoneX中全屏显示

    如果你的项目什么也不修改,直接把你的app运行在 iPhone X 模拟器下,很有可能就会出现下面的情形: 上下都有黑边,没有全屏显示 为了让app能够全屏显示,你需要准备以下的内…

    技术杂谈 2023年6月1日
    0103
  • Python改写PHP刷类目映射脚本逻辑

    1、文件Auto_update_data,需要处理的映射基础数据 #定义需要导入的映射数据 #以字典进行定义 [公司类目id : 平台类目id] #d = {key1 : valu…

    技术杂谈 2023年7月11日
    065
  • 【JAVA】排序算法之选择排序

    1.前言 基础排序算法,旨在简单易懂讲解算法逻辑和思路,以下均使用 升序方式来讲解和实现算法。 2.思路 选择排序重在 选择二字,比如给定一串数字 5 3 4 1 2,我们选定第一…

    技术杂谈 2023年6月21日
    081
  • 三行代码实现十进制转二进制

    转载请注明出处。谢谢 同学c++补考。找我帮忙写十进制转二进制的代码,为了让这同学能记住,所以就想写的简单些,然后没想到竟然能这么简单,感觉还不错。 直接上代码: void Dto…

    技术杂谈 2023年5月31日
    087
  • 测试计划

    ​ 1.测试计划的定义:描述需要完成的所有工作,包括被测项目的目的、背景、范围、资源、进度、环境、任务、策略,以及相应的风险和措施。 ​ 2.测试计划的作用: 对后面的测试过程起到…

    技术杂谈 2023年7月25日
    051
  • 【工作记录】JDBC连接MySQL,跨时区调查CST转Asia/Shangha

    根据业务要求,不同的国家设置jvm参数,来确定当前时区。 // -Duser.timezone=Asia/Kolkata 印度&…

    技术杂谈 2023年7月10日
    080
  • kettle插入更新

    kettle实现若主键存在则更新,若主键不存在则插入 Original: https://www.cnblogs.com/cheng9999/p/14085922.htmlAuth…

    技术杂谈 2023年7月24日
    081
  • 计算图像数据集的均值和方差(mean, std)用于transforms.Normalize()标准化

    Pytorch图像预处理时,通常使用transforms.Normalize(mean, std)对图像按通道进行标准化,即减去均值,再除以方差。这样做可以加快模型的收敛速度。其中…

    技术杂谈 2023年5月31日
    074
  • Mysql整体介绍(适用于5.X版本)(下)(标贝科技)

    Mysql整体介绍(适用于5.X版本)(下)(标贝科技) 二、InnoDB介绍[9-11] InnoDB是Mysql取得成功的最关键的引擎,其重要性不言而喻,下面将单独对该引擎的核…

    技术杂谈 2023年7月25日
    069
  • node使用es module

    https://www.npmjs.com/package/esm 作者:孟繁贵 Email:meng010387@126.com 期待共同进步! Original: https:…

    技术杂谈 2023年5月31日
    097
  • Codeforces Round #752 (Div. 2)

    Codeforces Round #752 (Div. 2) A. Era 思路分析: 答案其实就是这个数减去它改变位置后的pos即可。 对于第一位如果不是1,那么它就要在前面插入…

    技术杂谈 2023年7月24日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球