原型模式的定义

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

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

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

原型模式的通用代码:

原型模式的应用

原型模式的优点

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

原型模式的使用场景

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

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

原型模式的注意事项

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

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

23种设计模式之原型模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式

    · 原型模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,克隆模式算是一个人气比较高的娱乐模式了,因为该模式下双方可以各有五个一模一样的英雄,可以带给玩家不同的游戏体验,特别是有一些比较好玩的英雄, ...

  2. 23天读懂23种设计模式:原型模式(创建型)

    点击上方 蓝字 关注我们 创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建.组合和表示方式. 原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  3. 23种设计模式之原型模式代码实例

    原型模式就是利用一个克隆"原型"来产生新对象的一种模式, 克隆又分浅克隆与深克隆, 浅克隆:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. ...

  4. 《23种设计模式之原型模式(2种实现)》

    说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...

  5. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  6. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  7. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  8. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  9. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

最新文章

  1. 【总结整理】关于IE6的兼容性
  2. 451. 根据字符出现频率排序golang
  3. easyexcel将对象处理为多列,自增序列
  4. oel 7.0 安装 mysql 5_在linux上安装PostgreSQL 9.4并启动和关闭数据库
  5. ssms,新建查询设置字体_如何在SSMS查询编辑器中使用SQLCMD命令
  6. 数据持久化mysql_Nacos数据持久化到MySQL
  7. java restclient 调用_restclient 访问 springmvc java工程接口
  8. actor对自己不可见
  9. python起多进程服务_python 多进程详细总结
  10. 浅析busybox如何集成到openwrt
  11. Swift常用第三方库
  12. viper4android 机顶盒,利用VIPer53封装上系统实现经济型机顶盒供电
  13. vba随机抽取人名不重复_excel如何实现随机抽取且不重复
  14. 数论—乘法逆元—费马小定理
  15. 【历史上的今天】1 月 18 日:微软的“技术布道者”出生;反盗版法案抗议行动;哈佛 Mark I 灵感起源
  16. 服务器搭建网站公网ip,如何获取公网ip,自己搭建公网ip服务器的方法
  17. 什么是抽象类?什么是抽象方法?
  18. self和Self、== 和===的区别
  19. 风险投资(VC)私募股权投资(PE)30问答
  20. 安装驱动显卡重启计算机,win7系统安装显卡驱动后电脑一直重启的解决方法

热门文章

  1. 砥志研思SVM(二) 拉格朗日乘子法与KKT条件
  2. C++和Objective-C混编(官方文档翻译)
  3. CoreAnimation编程指南(一)概念
  4. Objective-C复制解析
  5. 现代软件工程 (备份)
  6. oracle中主键自增长,oracle 数据库主键自动增长方法
  7. 安装redis提示[test] error 2_安装PHP Redis扩展
  8. python小代码_Python爬虫入门有意思的小长代码
  9. 多屏互动协议 linux,【Linux系统多屏互动电视】Linux系统多屏互动电视报价及图片大全-列表版-ZOL中关村在线...
  10. 印刷体是什么意思_家长晒出4年级小学霸课前笔记,字迹堪比“印刷体”,老师都羡慕...