创建者模式 -- 单例模式(反射&序列化)
看的视频:https://www.bilibili.com/video/av43896218/?p=286
实现方式:(构造器私有,提供一个外部可以访问的方法(可以提供实例))
1、饿汉式:线程安全,调用效率高, 不能延时加载
2、懒汉式:线程安全,调用效率不高,可以延时加载(要用的时候才加载 )
3、双重锁检测式:“由于JVM底层内部模型原因,偶尔会出现问题,不建议使用”
4、静态内部类式:线程安全,调用效率高,且可以实现延时加载
(上面的四种方式都可以通过反射和反序列化 破坏 单例模式)
5、枚举:线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化
如果单例对象占用资源少,不需要延时加载:
枚举式 优于 饿汉式
如果单例对象占用资源大, 需要延时加载:
静态内部类式 优于 懒汉式
饿汉式:
/*
饿汉式: 最开始就已经把实例给创建好了
*/
public class Singleton01 {
public static Singleton01 instance = new Singleton01(); //一开始就已经创建好了
private Singleton01(){
}
public static Singleton01 getInstance(){
return instance;
}
}
懒汉式:
/*
懒汉式: 用的时候才会初始化实例 效率不高就是因为有synchronized这个关键字
*/
public class Singleton02 {
private static Singleton02 instance = null;
private Singleton02(){
}
public static synchronized Singleton02 getInstance(){
if(instance == null){
instance = new Singleton02();
}
return instance;
}
}
静态内部类:
/*
静态内部类: 只有在主动调用这个类的时候才会加载 外部类加载的时候 静态内部类不会加载
*/
public class Singleton03 {
static class Inner{
private static Singleton03 instance = new Singleton03();
}
private Singleton03(){ }
public static Singleton03 getInstance(){
return Inner.instance;
}
}
枚举:
/*
枚举 天然的可以防止 反射和反序列化
*/
public enum Singleton04 {
INSTANCE; //就表示一个实例 获取的时候直接 Singleton04.INSTANCE
public void method(){
//这里可以写一些方法
}
}
通过反射破坏单例模式:
public class Test01 {
public static void main(String[] args) throws Exception{
Class<?> clazz = Class.forName("com.test.Singleton01");
//获取构造函数:
Constructor c = clazz.getDeclaredConstructor();
c.setAccessible(true); //对于私有属性和方法 设置为允许访问
//通过构造函数 构造实例
Singleton01 singleton001 = (Singleton01)c.newInstance();
Singleton01 singleton002 = (Singleton01)c.newInstance();
System.out.println(singleton001 == singleton002); // false
}
}
如何破坏反射:
public class Singleton01 {
private static boolean flag = false; //标志位
public static Singleton01 instance = new Singleton01(); //一开始就已经创建好了
// 上面的已经调用过一次 这个私有的构造函数了
private Singleton01(){ //反射的时候操作的就是这个私有的构造函数
synchronized (Singleton01.class){
if(flag == false){
flag = true;
}else{ //表示第二次用构造函数进行实例化
throw new RuntimeException("单例模式正在被破坏");
}
}
}
public Singleton01 getInstance(){
return instance;
}
}
在用反射就会报错....
通过反序列化破坏单例模式:
对象序列化:将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或者通过网络发送到任何其他程序中。
反序列化:将字节流转化为对象的过程。
public class Test01 {
public static void main(String[] args) throws Exception{
//序列化 singleton001 Singleton01要实现 Serializable
Singleton01 singleton001 = Singleton01.getInstance();
Singleton01 singleton002 = Singleton01.getInstance();
FileOutputStream fos = new FileOutputStream("d:/a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(singleton001);
oos.close();
fos.close();
//反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/a.txt"));
Singleton01 singleton003 = (Singleton01)ois.readObject();
System.out.println(singleton001 == singleton002); //true
System.out.println(singleton001 == singleton003); //false
}
}
防止反序列化:
public class Singleton01 implements Serializable {
public static Singleton01 instance = new Singleton01(); //一开始就已经创建好了
private Singleton01(){
}
public static Singleton01 getInstance(){
return instance;
}
//在反序列化的时候 直接调用这个方法 返回instance 而不是返回反序列化后的新对象
private Object readResolve() throws ObjectStreamException {
return instance;
}
}
创建者模式 -- 单例模式(反射&序列化)的更多相关文章
- effective java笔记之单例模式与序列化
单例模式:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 单例模式实现方式有多种,例如懒汉模式(等用到时候再实例化),饿汉模式(类加载时就实例化)等,这里用饿汉模式方法 ...
- (Builder)创建者模式
定义: 建造模式:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示. 适用性: 当流程算法可以固定几个步骤,步骤的算法步骤执行顺序固定,且制造的产品可以唯一确定,这时使用创建 ...
- [设计模式] 3 创建者模式 builder
转载http://blog.csdn.net/wuzhekai1985/article/details/6667467 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不 ...
- Builder创建者模式
http://www.codeproject.com/Articles/42415/Builder-Design-Pattern In Elizabeth's day care center, the ...
- OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记
说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...
- C#设计模式之五创建者模式(Builder)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬 ...
- 创建者模式Builder
创建者模式: 分离对象子组件的单独构造(由Builder来负责)和装配(由Director负责),对象的构造比较复杂时使用 该模式. 类图: Builder 抽象建造者接口,规范各个组成部分的构建. ...
- 设计模式学习总结(五)创建者模式(Builder)
创建者模式,主要针对某些产品有类似的生产步骤,且有需要有先后顺序的进行各个部件的生成. 一.示例展示: 通过学习及总结,以下是我完成的创建者模式的示例: 1.创建产品类:Laptop public c ...
- 复杂UI的组织-创建者模式-uitableview思想
复杂节目的组织-创建者模式-uitableview思想 整体说明,部件规格说明
随机推荐
- AD中如何解决 同一局域网下证书冲突问题
AD中如何解决 同一局域网下证书冲突问题 https://wenku.baidu.com/view/c20e1720482fb4daa58d4b52.html
- 『动善时』JMeter基础 — 32、JMeter察看结果树组件详解
目录 1.察看结果树介绍 2.察看结果树界面详解 3.察看结果树的其他功能 (1)将数据写入文件中 (2)Search功能 (3)Scroll automatically选项 4.总结 1.察看结果树 ...
- conda 按照指定源下载python包
conda 按照指定源下载python包 换成了国内的pip源就可以正常安装了,我使用的是:pip install xlrd -i http://pypi.douban.com/simple --tr ...
- PVD与CVD性能比较
PVD与CVD性能比较 CVD定义: 通过气态物质的化学反应在衬底上淀积一层薄膜材料的过程. CVD技术特点: 具有淀积温度低.薄膜成分和厚度易于控制.均匀性和重复性好.台阶覆盖优良.适用范围广.设备 ...
- MindSpore技术理解(下)
MindSpore技术理解(下) 4 GraphEngine 由于深度学习算法需要进行大量的计算,很多公司都设计了自己的深度学习专用处理器(如谷歌的张量处理器.阿里巴巴的含光等),华为也发布了自主设计 ...
- Qt Creater快速定义函数的快捷键
1.简介 在Qt creator中编写函数的时候,在头文件编写了函数,需要在相应的cpp文件中编写对应的函数定义实现,如果每次都需要手动的敲击全部的代码,这会非常的耗时耗力,显得很方便,这时候就需要巧 ...
- 五、自定义Zabbix监控项目
要求: 沿用练习三,使用Zabbix实现自定义监控,实现以下目标:监控Linux服务器系统账户的数量. 方案: 需要使用Zabbix自定义key的方式实现自定义监控,参考如下操作步骤:1.创建自定义k ...
- Java设计模式(5:设计模式的分类及工厂模式详解)
一.设计模式的分类 总的来说,设计模式可以分为三大类:创建型模式.结构型模式.行为型模式,具体如下图: 二.工厂模式 工厂模式分为简单工厂模式.工厂方法模式和抽象工厂模式.其中简单工厂模式并不属于23 ...
- SpringCloud Alibaba实战(6:nacos-server服务搭建)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 这一节我们来学习SpringCloud Alibaba体系中一 ...
- Netty 面试题 (史上最全、持续更新)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...