23种设计模式之原型模式

原型模式的定义

定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象.

通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象

原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法.

原型模式的通用代码:

23种设计模式之原型模式

 

原型模式的应用

原型模式的优点

  1. 性能优良. 原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点
  2. 逃避构造函数的约束. 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑

原型模式的使用场景

  1. 资源优化场景. 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等
  2. 性能和安全要求的场景. 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
  3. 一个对象多个修改者的场景. 一个对象需要提供给其它对象访问, 而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.

在实际项目中,原型模式很少单独出现, 一般是和工厂方法模式一起出现, 通过clone的方法创建一个对象, 然后由工厂方法提供给调用者.

原型模式的注意事项

  1. 构造函数不会被执行. 因为Object类的clone方法是从内存中以二进制流的方式进行拷贝, 重新分配一个内存块, 那构造函数没有执行也就十分正常了
  2. 浅拷贝和深拷贝. Object类提供的方法clone只是拷贝本对象, 其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫浅拷贝. 这时两个对象共享同一个变量, 你改我也改, 是一种非常不安全的方式. 那怎么实现深拷贝呢? 对类变量进行独立的拷贝即可. 这样两个对象你改你的,我改我的,互不影响.
  3. clone和final. 对象的clone与对象内的final是有冲突的. 对象的final变量不能拷贝

原型模式先生产出一个包含大量共有信息的类, 然后可以拷贝出副本, 修正信息, 建立了一个玩完整的个性对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课堂笔记——Data Mining(1)

一、Introduction …… 1、Major Issues in Data Mining User Interaction Presentation and visualization of data mining results : Efficiency and Scalability Diversity of data types: complex types of data; Mining dynamic, networked, and global data reposit…

23种设计模式之代理模式

代理模式的定义 代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫做委托模式, 它是一项基本设计技巧. 许多其他的模式, 如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式, 而且在日常的应用中,…

论文翻译——FingerSound:Recognizing unistroke thumb gestures using a ring

1. INTRODUCTION 可穿戴计算已经发展到相当大的消费市场,近年来已经有了大量的应用。可穿戴设备 - 最突出的智能手表和屏幕带,以及Oculus Rift等移动虚拟现实设备 - 现在可以被视为商品硬件,大部分人口在日常生活中使用它们。随着这种普及&am…

23种设计模式之中介者模式

中介者模式的定义 中介者模式, 当多个类彼此关联, 会增大耦合性, 这时各个模块通过中介者进行交流, 每个模块只负责自己的业务逻辑, 不属于自己的就丢给中介者, 降低耦合 定义: 用一个中介对象封装一系列的对象交互, 中介者使各对象不需要显示的相互作用,从而使其耦合松散,而…

23种设计模式之命令模式

命令模式的定义 定义: 将一个请求封装成一个对象, 从而让你使用不同的请求将客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能 通俗的说, 就是当有不同的请求时, 将每一种请求都封装成一个对象, 不同的请求调用不同的执行者来执行 命令模式的通用类…

23种设计模式之责任链模式

责任链模式的定义 定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止 通俗的讲, 就是将对请求的处理组成一条链, 当请求来时, 在链中依次传递, 知道找到能够处理此请求的…

Android Studio Process 'command ...\aapt.exe'' finished with non-zero exit value 1

错误:Process command "...\build-tools\27.0.3\aapt.exe finished with non-zero exit value 1 org.gradle.initialization.ReportedException: org.gradle.internal.exceptions.LocationAwareException: Execution failed for task :app:processDebugResour…

23种设计模式之装饰模式

装饰模式的定义 定义: 动态的给一个对象添加一些额外的职责. 就增加功能来说, 装饰模式相比生成子类更为灵活. 通俗的说, 就是对一个类或方法进行包装 装饰模式的通用类图: 类图中的四个角色说明如下: Component 抽象构件: Component是一个接口或抽象类, 就是定义我们最核心…

23种设计模式之策略模式

策略模式的定义 定义: 定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换 通俗的说, 就是对一个接口下的一组算法进行封装 其类图如下: 其中三个角色说明: Strategy 抽象策略角色: 策略、算法家族的抽象, 通常为接口, 定义每个策略或算法必须具有的方法和属性Co…

23种设计模式之门面模式

门面模式的定义 定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用. 通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道 其类图如下: 其中两个角色如下: Fac…

转载:Android Studio 3.1.2 新项目报错 AAPT2 error: check logs for details (Gradle 3.1.2)

转载自 https://blog.csdn.net/u011618035/article/details/80574645 原本好好的项目,突然有一天打开就开始报错AAPT2 error: check logsfor details。展开错误详细信息错误文本com.android.build.gradle.tasks.ResourceException:Error: java.util.concurrent.Exec…

23种设计模式之迭代器模式

迭代器模式的定义 定义: 它提供一种方法访问一个容器对象中各个元素, 而又不需暴露该对象的内部细节 其类图如下: 其中角色: Iterator 抽象迭代器: 抽象迭代器负责定义访问和遍历元素的接口, 而且基本上是有固定的三个方法: first()获得第一个元素, next()访问下一个元素, i…

23种设计模式之适配器模式

适配器模式的定义 定义: 将一个类的接口变换成客户端所期待的另一种接口, 从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 通俗的说, 就是有 A、B两个接口, 现在要求把A和B安装在一起使用, 两者的接口不一致, 怎么办? 引入一个物体C, 如下图: 引入C物体后,…

23种设计模式之组合模式

组合模式的定义 定义: 将对象组合成树形结构以表示 "部分-整体" 的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 通俗的说, 就是实现了树形结构 通用类图如下: 其中的三个角色如下: Component 抽象构件角色: 定义参加组合对象的共有方法和属性, 可以…

23种设计模式之观察者模式

观察者模式的定义 定义: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 通俗的说, 就是一个类的某个条件满足时, 会调用一系列定义好的方法 其类图如下: 其中的4个角色: Subject 被观察者: 定义被观察者必须实现…

23种设计模式之访问者模式

访问者模式的定义 定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问 其类图如下: 各角色说明: Vistor 抽象访问者: 抽象类…

23种设计模式之解释器模式

解释器模式的定义 定义: 给定一门语言,定义它的文法的一种表示, 并定义一个解释器, 该解释器使用该表示来解释语言中的句子. 其类图如下: 其中的角色说明: AbstractExpression 抽象解释器: 具体的解释任务由各个实现类完成TerminalExpression 终结符表达式: 实现与文法中的元…

23种设计模式之备忘录模式

备忘录模式的定义 定义: 在不破坏封装性的前提下, 捕获一个对象的内部状态, 并在该对象之外保存这个状态. 这样以后就可将该对象回复到原先保存的状态 通俗的说, 就是记录下类的当前状态, 当需要的时候恢复 类图如下: 其中各角色如下: Originator 发起人角色: 记录当前时刻…

23种设计模式之状态模式

状态模式的定义 定义: 当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类 通俗的说, 就是一个事物有不同的状态,在不同状态下执行各个方法时有不同的表现, 将每个状态都封装成一个类, 然后通过上下文对象统一管理 其类图如下: 其中的三个角色如下: Stat…

二维码的纠错码原理及细节

参考文档: https://www.thonky.com/qr-code-tutorial/error-correction-coding 1. 消息多项式 消息多项式的系数组成:数字码字。如“hello world” ,利用二维码的编码原理,转换成十进制数字为“32, 91, 11, 120, 209, 114, 220, 77, 67, 64…