原型模式
时间:2022-07-25
本文章向大家介绍原型模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原型模式
原型模式Prototype Pattern
用原型实例指向创建对象的类,使用于创建新的对象的类的共享原型的属性与方法。
描述
在JavaScript
中可以利用其特有的原型继承特性去实现创建对象的方式,也就是创建的一个对象作为另外一个对象的prototype
属性值,原型对象本身就是有效地利用了每个构造器创建的对象,其将实例之间相同的属性和方法提取成共有的属性和方法,而这些属性与方法都可以被实例共享。
在Java
中通常是用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,即通过一个抽象类实现Cloneable
接口以及重写Object
类中的clone
方法,之后使用子类继承此抽象类并在一个缓存类中使用集合类例如HashTable
进行存储,当需要类时便可以找到HashTable
中该类通过clone
实现得到一个新的子类,使用原型模式创建对象比直接new
一个对象在性能上要好的多,因为Object
类的clone
方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单,所以在需要重复地创建相似对象时可以考虑使用原型模式,此外深拷贝与浅拷贝问题中,会发生深拷贝的有Java
中的8
种基本类型以及他们的封装类型以及String
类型,其余的都是浅拷贝。
优点
- 提高性能。
- 避免构造函数的约束。
缺点
- 在原型中需要对所有类的功能进行考虑。
- 创建对象不会调用类的构造方法。
实现
var Shape = {
name : null,
say: function(){
console.log(this.name);
}
}
var rectangle = Object.create(Shape);
rectangle.name = "Rectangle";
rectangle.say(); // Rectangle
var square = Object.create(Shape);
square.name = "Square";
square.say(); // Square
var circle = Object.create(Shape);
circle.name = "Circle";
circle.say(); // Circle
每日一题
https://github.com/WindrunnerMax/EveryDay
参考
https://segmentfault.com/a/1190000012427846
https://www.runoob.com/design-pattern/prototype-pattern.html
https://wiki.jikexueyuan.com/project/java-design-pattern/prototype-pattern.html
- golang 裸写一个pool池控制协程的大小
- 2014---多校训练2(ZCC Loves Codefires)
- 完整的golang 多协程+信道 任务处理示例
- 2014---多校训练一(A Couple doubi)
- hdu----(2586)How far away ?(DFS/LCA/RMQ)
- Golang控制goroutine的启动与关闭
- spring-boot-starter-swagger迎新伙伴支持,加速更新进度(1.3.0.RELEASE)
- poj----(1470)Closest Common Ancestors(LCA)
- 测试一下golang协程资源占有率
- poj----1330Nearest Common Ancestors(简单LCA)
- fasthttp中的协程池实现
- Oracle 12c R2版本 Application Containers 特性(二)
- go sync.Mutex 设计思想与演化过程 --转
- hadoop开发必读:认识Context类的作用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java基础数据类型之包装类equals和==详解
- SCP不用密码传输文件
- Java 使用Collections.reverse对list集合进行降序排序
- Liquibase异常 mysql数据库 Cannot add foreign key constraint
- Linux获取文件最后修改时间
- Crontab脚本无法正常执行问题
- Python 输入时间字符串以分钟单位计算时间差
- Linux下执行bcp指令
- Python 处理时间差
- Zabbix发送带附件的邮件
- CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
- CentOs7下Zabbix安装教程——zabbix server安装
- CentOs7下Zabbix安装教程——准备工作
- python:HTTP Error 505: HTTP Version Not Supported
- PYES异常: TypeError: 'NoneType' object is not callable