23种设计模式之原型模式
原型模式的定义
定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象.
通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象
原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法.
原型模式的通用代码:
原型模式的应用
原型模式的优点
- 性能优良. 原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点
- 逃避构造函数的约束. 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑
原型模式的使用场景
- 资源优化场景. 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等
- 性能和安全要求的场景. 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
- 一个对象多个修改者的场景. 一个对象需要提供给其它对象访问, 而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.
在实际项目中,原型模式很少单独出现, 一般是和工厂方法模式一起出现, 通过clone的方法创建一个对象, 然后由工厂方法提供给调用者.
原型模式的注意事项
- 构造函数不会被执行. 因为Object类的clone方法是从内存中以二进制流的方式进行拷贝, 重新分配一个内存块, 那构造函数没有执行也就十分正常了
- 浅拷贝和深拷贝. Object类提供的方法clone只是拷贝本对象, 其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫浅拷贝. 这时两个对象共享同一个变量, 你改我也改, 是一种非常不安全的方式. 那怎么实现深拷贝呢? 对类变量进行独立的拷贝即可. 这样两个对象你改你的,我改我的,互不影响.
- clone和final. 对象的clone与对象内的final是有冲突的. 对象的final变量不能拷贝
原型模式先生产出一个包含大量共有信息的类, 然后可以拷贝出副本, 修正信息, 建立了一个玩完整的个性对象
23种设计模式之原型模式相关推荐
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式
· 原型模式在王者荣耀中的应用 · 一.简述 在王者荣耀中,克隆模式算是一个人气比较高的娱乐模式了,因为该模式下双方可以各有五个一模一样的英雄,可以带给玩家不同的游戏体验,特别是有一些比较好玩的英雄, ...
- 23天读懂23种设计模式:原型模式(创建型)
点击上方 蓝字 关注我们 创建型模式是用来创建对象的模式,抽象了实例化的过程,帮助一个系统独立于其他关联对象的创建.组合和表示方式. 原型模式目的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...
- 23种设计模式之原型模式代码实例
原型模式就是利用一个克隆"原型"来产生新对象的一种模式, 克隆又分浅克隆与深克隆, 浅克隆:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的. ...
- 《23种设计模式之原型模式(2种实现)》
说在前头:本人为大二在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,能力有限,文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正.若 ...
- 二十三种设计模式之原型模式
今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...
- 23种设计模式——装饰者模式
文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...
- 实践GoF的23种设计模式:建造者模式
本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...
- 【Go实现】实践GoF的23种设计模式:命令模式
上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...
- 23种设计模式7_代理模式之一静态代理
23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...
最新文章
- 【总结整理】关于IE6的兼容性
- 451. 根据字符出现频率排序golang
- easyexcel将对象处理为多列,自增序列
- oel 7.0 安装 mysql 5_在linux上安装PostgreSQL 9.4并启动和关闭数据库
- ssms,新建查询设置字体_如何在SSMS查询编辑器中使用SQLCMD命令
- 数据持久化mysql_Nacos数据持久化到MySQL
- java restclient 调用_restclient 访问 springmvc java工程接口
- actor对自己不可见
- python起多进程服务_python 多进程详细总结
- 浅析busybox如何集成到openwrt
- Swift常用第三方库
- viper4android 机顶盒,利用VIPer53封装上系统实现经济型机顶盒供电
- vba随机抽取人名不重复_excel如何实现随机抽取且不重复
- 数论—乘法逆元—费马小定理
- 【历史上的今天】1 月 18 日:微软的“技术布道者”出生;反盗版法案抗议行动;哈佛 Mark I 灵感起源
- 服务器搭建网站公网ip,如何获取公网ip,自己搭建公网ip服务器的方法
- 什么是抽象类?什么是抽象方法?
- self和Self、== 和===的区别
- 风险投资(VC)私募股权投资(PE)30问答
- 安装驱动显卡重启计算机,win7系统安装显卡驱动后电脑一直重启的解决方法
热门文章
- 砥志研思SVM(二) 拉格朗日乘子法与KKT条件
- C++和Objective-C混编(官方文档翻译)
- CoreAnimation编程指南(一)概念
- Objective-C复制解析
- 现代软件工程 (备份)
- oracle中主键自增长,oracle 数据库主键自动增长方法
- 安装redis提示[test] error 2_安装PHP Redis扩展
- python小代码_Python爬虫入门有意思的小长代码
- 多屏互动协议 linux,【Linux系统多屏互动电视】Linux系统多屏互动电视报价及图片大全-列表版-ZOL中关村在线...
- 印刷体是什么意思_家长晒出4年级小学霸课前笔记,字迹堪比“印刷体”,老师都羡慕...