Java23种设计模式
时间:2021-08-20
本文章向大家介绍Java23种设计模式,主要包括Java23种设计模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
1、单例模式
- 饿汉式
package com.liuxiang.Singleton;
//一上来就创建对象
public class TestSingleton {
//饿汉式 构造器私有 避免别人创建对象
private TestSingleton(){
}
// 饿汉式可能会造成浪费空间
private final static TestSingleton singleton = new TestSingleton();
public static TestSingleton getInstance(){
return singleton;
}
}
- 懒汉式
package com.liuxiang.Singleton;
public class TestSingleton {
//构造器私有 避免别人创建对象
private TestSingleton(){
}
// 懒汉式可能会造成浪费空间 volatile确保不会被指令重排
private volatile static TestSingleton singleton;
public static TestSingleton getInstance(){
if (singleton == null){
//多线程获取 需要使用synchronized 双重检测锁模式
synchronized (TestSingleton.class){
if (singleton == null){
singleton = new TestSingleton();
//DCL懒汉式双重检测机制,在极端情况下还是会出现问题
//new一个对象在正常情况下的执行流程应该是:
//1.分配内存空间
//2.执行构造方法,初始化对象
//3.把这个对象指向这个空间
//如果出现了指令重排123 变成了132 就会出现问题
//所以我们应该加上volatile确保不会发生指令重排
}
}
}
return singleton;
}
}
- 使用枚举确保单例模式不被反射破坏
package com.liuxiang.Singleton;
import java.lang.reflect.Constructor;
public class TestSingleton {
//构造器私有 避免别人创建对象
private TestSingleton(){
}
// 懒汉式可能会造成浪费空间 volatile确保不会被指令重排
private volatile static TestSingleton singleton;
public static TestSingleton getInstance(){
if (singleton == null){
//多线程获取 需要使用synchronized 双重检测锁模式
synchronized (TestSingleton.class){
if (singleton == null){
singleton = new TestSingleton();
}
}
}
return singleton;
}
//使用反射创建对象 破坏单例模式
public static void main(String[] args) throws Exception {
Constructor<TestSingleton> declaredConstructor = TestSingleton.class.getDeclaredConstructor(null);
declaredConstructor.setAccessible(true);//关闭安全检测
TestSingleton singleton1 = declaredConstructor.newInstance();//通过反射创建对象
TestSingleton singleton2 = declaredConstructor.newInstance();//通过反射创建对象
System.out.println(singleton1);
System.out.println(singleton2);
}
}
com.liuxiang.Singleton.TestSingleton@1b6d3586
com.liuxiang.Singleton.TestSingleton@4554617c
使用反射就可以绕过私有变量创建新的对象,我们查看反射的源码可以发现:反射机制不能操作枚举类
原文地址:https://www.cnblogs.com/lx2001/p/15168052.html
- React Native和Android整合详解
- 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
- WEB前端架构(二)
- WEB前端架构(三)
- node.js基本工作原理及流程
- Github+Jekyll搭建个人博文网站
- Ecmascript语法之Symbol
- 区块链的java实现
- gitlab操作指南
- 如何构建智能反垃圾邮件WordPress插件
- 在Mac上搭建React Native开发环境
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide图片缓存库的联系与区别
- React Native之StyleSheet样式表
- 高仿ios斗鱼界面
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 10元最多可喝多少瓶啤酒?(不可借酒+可借酒,swift语言实现)
- 单细胞转录组高级分析二:转录调控网络分析
- 关于数组内元素是否会被改变的思考
- 排序之选择排序实现(swift)
- 去除友盟等第三方SDK失败的解决办法(clang: error: no such file or directory:xx)
- iOS踩坑之多代理模式使用注意
- 单细胞转录组高级分析三:细胞通讯分析
- 单细胞转录组高级分析四:scRNA数据推断CNV
- 0808-7.1.1-如何在CDP7.1.1指定Hive SQL的资源池队列
- iOS多线程之GCD、OperationQueue 对比和实践记录
- singleR的7个数据库文件下载失败的解决方案
- Spring Boot 如何快速集成 Redis 哨兵?
- 一行命令实现成“吨”测试数据的转码
- Jenkins参数化构建与触发
- 数据无法模拟,自动化受阻怎么办?