JAVA设计模式 2【创建型】原型模式的理解与使用
在本节中,我们将学习和使用原型模式;这一节学习的原型模式也是创建型 模式的其中之一。再次复习一下:创建型 模式就是描述如何去更好的创建一个对象。
我们都知道,在JAVA 语言中。使用new 关键字创建一个新对象。将新的对象放到堆内存 里面。当然,这个内存肯定是有大小限制的,况且,JAVA 不同于C语言等。 有内存管理机制,就是我们常说的垃圾回收器GC,才可以保证内存不被溢出。
说这些其实就是为了表示:为啥要用单例模式,能节省内存的时候,能用一个对象解决重复的事情,绝对不会创建多个。
概述
原型模式描述的如何快速创建重复的对象,并且减少new 关键字的使用。
- 抽象原型类
- 具体原型类
- 访问类
容我来一个一个解释:
抽象原型类 也就是我们具体要实现的某个类,这个类在JAVA 里面是有具体的接口的,其实是一个空接口,Cloneable
* @author unascribed
* @see java.lang.CloneNotSupportedException
* @see java.lang.Object#clone()
* @since JDK1.0
*/
public interface Cloneable {
}
我们会发现,这个类没有任何的方法,怎么来实现它,不要慌。先接着走。
具体原型类 也就是我们具体要克隆 的对象。比如我们重复的要创建100个学生Student 对象,那么具体的学生对象就是具体原型类
public class Student implements Cloneable {
private int id;
private String name;
private int sex;
}
访问类 我就不必多说了
浅克隆和深克隆
原型模式其实也分浅克隆和深克隆。如何理解这两个概念呢?
浅克隆
protected native Object clone() throws CloneNotSupportedException;
浅克隆,只需要具体原型类 实现Cloneable 接口,并且重写父类Object类的clone() 方法,即可实现对象的浅克隆。
Student student1 = new Student(1, "李四");
Student student2 = student1.clone();
System.out.println(student1);
System.out.println(student2);
System.out.println(student1 == student2);
---------------------
学号:1,姓名:李四
学号:1,姓名:李四
false
- 通过执行
clone()方法即可创建一个相同的,具有同样属性的对象。 - 并且是新的对象,内存地址有所不同。
我们来看看,对于引用类型的变量,浅克隆是否可以进行克隆;
Teacher teacher = new Teacher(1, "张老师");
Student student1 = new Student(1, "李四", teacher);
Student student2 = student1.clone();
System.out.println(student1);
System.out.println(student2);
System.out.println(student1 == student2);
------------
学号:1,姓名:李四,老师=Teacher@1b6d3586
学号:1,姓名:李四,老师=Teacher@1b6d3586
false
我们发现,引用类型并没有被克隆,也就是说:
特点
- 浅克隆对于基本类型,可以进行完全的克隆,并且克隆的对象是一个新的对象
- 但是对象里面的引用,是无法被克隆的。
深克隆(序列化)
何谓序列化?
我们创建的都是保存在内存里面的,只要被虚拟机GC进行回收,那么这个对象的任何属性都是消失,我们能不能找一个方法,将内存中这种对象的属性以及对象的状态通过某种东西保存下来,比如保存到数据库,下次从数据库将这个对象还原到内存里面。 这就是序列化。
- 序列化
内存对象->序列字符 - 反序列化
序列字符->内存对象
JAVA 序列化
* @see java.io.Externalizable
* @since JDK1.1
*/
public interface Serializable {
}
JAVA 提供了一个空接口,其实这个接口和上面的Cloneable 一样,都是一个空接口,其实这个空接口就是作为一种标识 你的对象实现了这个接口,JAVA 认为你的这个就可以被序列化 ,就是这么简单。
Teacher teacher = new Teacher(1, "张老师");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(outputStream);
stream.writeObject(teacher);
System.out.println(Arrays.toString(outputStream.toByteArray()));
----------
[-84, -19, 0, 5, 115, 114, 0, 7, 84, 101, 97,。。。。。。
通过将对象序列化、其实也就是将内存中的对象转化为二进制 字节数组
反序列化
Teacher teacher = new Teacher(1, "张老师");
System.out.println(teacher);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(outputStream);
stream.writeObject(teacher);
System.out.println(Arrays.toString(outputStream.toByteArray()));
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream inputStream = new ObjectInputStream(byteArrayInputStream);
Teacher teacher1 = (Teacher) inputStream.readObject();
System.out.println(teacher1);
---------------
id=1,name=张老师
[-84, -19, 0, 5, 115, xxxxx,-127, -27, -72, -120]
id=1,name=张老师
通过序列化和反序列化,即可对象的深克隆
小结
这一节,在讲述 原型模式的同时,将原有实现原型模式的clone() 浅克隆,延伸到深克隆这一概念。其实JAVA 的原型模式,实现起来较为简单。但还是要按需要实现,Object 类提供的 clone 浅克隆 是没办法克隆对象的引用类型的。需要克隆引用类型,还是需要序列化 深克隆
参考
http://c.biancheng.net/view/1343.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1298366845681698
代码示例
https://gitee.com/mrc1999/Dev-Examples
欢迎关注

JAVA设计模式 2【创建型】原型模式的理解与使用的更多相关文章
- Java设计模式(4)原型模式(Prototype模式)
Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是: ...
- 【java】java设计模式(5):原型模式(Prototype)
原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中 ...
- Java设计模式之创建型模式
创建型模式分为五类:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式 一.工厂方法模式:接口-实现类.工厂类
- 【设计模式】Java设计模式精讲之原型模式
简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...
- Java设计模式_创建型模式_单例模式
单例模式的实现: 定义一个类,在类中定义该类的静态变量,再定一个一个获取该类的静态变量的方法. UML图:
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- Java设计模式(15)备忘录模式(Memento模式)
Memento定义:memento是一个保存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态. Memento模式相对也比较好理解,我们看下列代码: public class ...
- Java设计模式(12)迭代模式(Iterator模式)
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...
随机推荐
- Java的字节流,字符流和缓冲流对比探究
目录 一.前言 二.字节操作和字符操作 三.两种方式的效率测试 3.1 测试代码 3.2 测试结果 3.3 结果分析 四.字节顺序endian 五.综合对比 六.总结 一.前言 所谓IO,也就是Inp ...
- Python 每日一练(2)
引言 我又双叒叕的来啦,新博客的第二篇文章,这次是继之前公众号上每日一练的第二个,这次是专题实对于文件的一些处理的练习 主要有以下几类: 1.实现英文文章字频统计 2.统一剪裁某一指定目录下的所有图片 ...
- Java IO(二)File
Java IO(二)File 一.概述 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成.F ...
- 前端基础知识之html和css全解
前端回顾 目录 前端回顾 基础知识 HTTP协议 认识HTML HTML组成 HTML标签 div和span标签 特殊的属性 常用标签 认识css 选择器 属性 前端就是展示给用户并且与用户进行交互的 ...
- Java实现 LeetCode 741 摘樱桃(DFS || 递推 || 传纸条)
741. 摘樱桃 一个N x N的网格(grid) 代表了一块樱桃地,每个格子由以下三种数字的一种来表示: 0 表示这个格子是空的,所以你可以穿过它. 1 表示这个格子里装着一个樱桃,你可以摘到樱桃然 ...
- Java实现 LeetCode 547 朋友圈(并查集?)
547. 朋友圈 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指 ...
- Java实现 蓝桥杯VIP 基础练习 2n皇后问题
基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一 ...
- Java实现 LeetCode 100 相同的树
100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [ ...
- Java实现 蓝桥杯 算法提高 最长滑雪道
试题 算法提高 最长滑雪道 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小袁非常喜欢滑雪, 因为滑雪很刺激.为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上 ...
- java实现第七届蓝桥杯机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A ...