原型模式
时间:2020-09-16
本文章向大家介绍原型模式,主要包括原型模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
定义
首先创建一个实例,然后通过这个实例去拷贝创建新的实例。
关系
Student student = new Student("xiaoming", new Bag("nick"));
Student clone = (Student) student.clone();
通过clone的方式来构造对象
注意的点
1、克隆对象不会调用构造方法
从上面的输出其实我们也可以发现,构造方法只在一开始我们创建原型的时候输出了,fileB和fileC都没有调用构造方法,这是因为执行clone方法的时候是直接从内存中去获取数据的,在第一次创建对象的时候就会把数据在内存保留一份,克隆的时候直接调用就好了
2、访问权限对原型模式无效
原理也很简单,我们是从内存中直接复制的,所以克隆起来也会直接无视,复制相应的内容就好了。
使用场景
当我们的类初始化需要消耗很多的资源时,就可以使用原型模式,因为我们的克隆不会执行构造方法,避免了初始化占有的时间和空间。
深拷贝和浅拷贝
浅拷贝
如果只是调用super.clone()则实现的浅拷贝
只是对于引用类型的成员变量,只是复制的是其引用。
深拷贝
对于深拷贝,引用类型的变量是实现的拷贝的完整的对象,而不是引用地址
public class Student implements Cloneable {
private String name;
private Bag bag;
public Student(String name, Bag bag) {
this.name = name;
this.bag = bag;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bag getBag() {
return bag;
}
public void setBag(Bag bag) {
this.bag = bag;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student ans = (Student) super.clone();
ans.setBag((Bag) ans.getBag().clone());
return ans;
}
}
public class Bag implements Cloneable {
private String brand;
public Bag(String brand) {
this.brand = brand;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
实现深拷贝的方式
除了以上的方式,还有一种经典方式是通过序列化和反序列化,但是由于序列化和反序列化涉及到了文件的操作,所以效率不如重新clone方法的方式。
原文地址:https://www.cnblogs.com/lexiaoyao1995/p/13680171.html
- 必应首页平铺背景图片的实现方案
- 我们是如何优化HAProxy以让其支持200万个并发SSL连接的?
- 【译】《Understanding ECMAScript6》- 第八章-Module
- 【译】《Understanding ECMAScript6》- 第七章-Promise
- 自定义gradview
- Redis 起步
- JVM参数详解及OOM
- 【译】《Understanding ECMAScript6》- 第五章-Class
- 【译】《Understanding ECMAScript6》- 第三章-Object
- 【译】《Understanding ECMAScript6》- 第二章-函数
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(二)
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(一)
- 聊聊C10K问题及解决方案
- 【译】《Understanding ECMAScript6》- 简介
- 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 数组属性和方法