抽象单例:一种通用的单例
背景
单例的一般写法,大家基本都会,这里特指具有以下特征的单例:
1.单例
2.需要延迟加载
3.线程安全
看一下这个类的写法(JAVA):
public class A {private static final AtomicReference<A> ref = new AtomicReference<>();private A() {}public static A get() {A ret = ref.get();if (ret == null) {synchronized (ref) {if (ref.get() == null) {ret = new A();} else {ret = ref.get();}}}return ret;}
}
问题:
这样写是没问题。我们大部分时候也都这么写。
如果我们有好几个类都要写单例怎么办,A,B,C….?挨个搞一遍?万一以上代码出了问题,需要修复,再挨个修复一遍?显然不能这么搞。
解决方法
我观察了一下这些类的规律,整个类的代码基本相同,只有对象创建部分不同。根据OO的基本特性,我们可以把这部分不一样的代码,放到子类里去,延迟实现。
我们可以这样一个辅助类,我称它为“抽象单例”:
/*** 线程安全的抽象单例* * @author zhmt* @createdate 2016年3月4日 下午4:39:50* @param <T>*/
public abstract class AbstractSingleton<T> {private final AtomicReference<T> ref = new AtomicReference<T>();public T get() {T ret = ref.get();if (ret == null) {synchronized (this) {if (ref.get() == null) {ret = newObj();ref.set(ret);} else {ret = ref.get();}}}return ret;}protected abstract T newObj();
}
通过这个类,我们就把对象创建的操作延后了。
现在,再看我们怎么实现A的单例:
public class A {public static final AbstractSingleton<A> objHolder = new AbstractSingleton<A>() {protected A newObj() {return new A();}};private A() {A.objHolder.get();}
}
这里只需要写几行简单的代码,而不是复杂易错的初始化过程,这样,以后所有类似的单例都得到了简化。
获取A的单例:
A.objHolder.get();
这样,以后再需要单例的时候,我只需要声明一个AbstractSingletion对象,并实现newObj方法即可。
如果你有更好的办法,欢迎讨论。
抽象单例:一种通用的单例相关推荐
- 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式
单例五种创建方式(下一篇:工厂模式) 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式( ...
- SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
- java23种设计模式+单例_Java23种设计模式之单例模式
一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点: 1.单例类只能有一个实例: 2.单例类必须自己创建自己的唯一的实例: ...
- JAVA23种设计模式:单例设计模式【二】
在有些系统中,为了节省内存资源,保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式 单例设计模式的定义与特点 定义: 指一个类只有一个实例 ,且该类能自行创建这个实列的一种模式. ...
- 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)
23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...
- 翻译 | ORB-SLAM: a Versatile and Accurate Monocular SLAM System(ORB-SLAM:一种通用的(全能的)精确的单目SLAM系统)
博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 ORB-SLAM:一种通用的(全能 ...
- JS通用表单验证函数
Check.js JS函数文件 /* *--------------- 客户端表单通用验证CheckForm(oForm) ----------------- * 功能:通用验证所有的表单元素 ...
- JavaScript - JavaScript通用表单验证函数(实例)
Check.js JS函数文件 /* *--------------- 客户端表单通用验证CheckForm(oForm) ----------------- * 功能:通用验证所有的表单元素. ...
- java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...
什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...
最新文章
- zabbix企业应用之监控oracle
- pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换
- WCF入门教程(vs2010)
- 新51CTO博客体验笔记
- 【思维导图】Python中常用的8种字符串操作
- WebApp本地存储 (离线缓存策略策略)
- java字符流解析_Java IO(四):字符流详解
- show一下自己的文档编写功底
- oracle基本的操作
- android 系统应用在运行时被卸载
- 天视通ipc地址修改工具_远程运行小工具PsExec
- conda 虚拟环境内安装git_用anaconda创建的虚拟环境安装FALCON
- 【概率统计】(在更)
- mapbox创建空白底图
- [15元]人体行为检测和识别毕业论文讲述
- BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过
- Ubuntu 19.04初体验
- 《自控力》直面自身欲望,但不要付诸行动
- 高级测试开发进阶知识详解
- 如何写一份让 HR 眼前一亮的简历(附模板)