背景

单例的一般写法,大家基本都会,这里特指具有以下特征的单例:
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方法即可。

如果你有更好的办法,欢迎讨论。

抽象单例:一种通用的单例相关推荐

  1. 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式

    单例五种创建方式(下一篇:工厂模式) 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式( ...

  2. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...

    做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...

  3. java23种设计模式+单例_Java23种设计模式之单例模式

    一.单例模式简介 单例模式是Java设计模式中常见的一种模式.主要分为懒汉式单例.饿汉式单例.登记式单例: 单例模式的特点:  1.单例类只能有一个实例:  2.单例类必须自己创建自己的唯一的实例: ...

  4. JAVA23种设计模式:单例设计模式【二】

    在有些系统中,为了节省内存资源,保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式 单例设计模式的定义与特点 定义: 指一个类只有一个实例 ,且该类能自行创建这个实列的一种模式. ...

  5. 23种设计模式:单例设计模式(饿汉式 VS 懒汉式)

    23种设计模式:单例设计模式(饿汉式 VS 懒汉式) 每博一文案 世事浮沉,有太多的责任需要我们担当,生活中总有些挫折和磨难,让我们觉得快要杠不住了. 但当我们咬牙坚持过那段难熬的时光后,发现并没有想 ...

  6. 翻译 | 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:一种通用的(全能 ...

  7. JS通用表单验证函数

    Check.js   JS函数文件 /*  *--------------- 客户端表单通用验证CheckForm(oForm) -----------------  * 功能:通用验证所有的表单元素 ...

  8. JavaScript - JavaScript通用表单验证函数(实例)

    Check.js    JS函数文件 /* *--------------- 客户端表单通用验证CheckForm(oForm) ----------------- * 功能:通用验证所有的表单元素. ...

  9. java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...

最新文章

  1. zabbix企业应用之监控oracle
  2. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换
  3. WCF入门教程(vs2010)
  4. 新51CTO博客体验笔记
  5. 【思维导图】Python中常用的8种字符串操作
  6. WebApp本地存储 (离线缓存策略策略)
  7. java字符流解析_Java IO(四):字符流详解
  8. show一下自己的文档编写功底
  9. oracle基本的操作
  10. android 系统应用在运行时被卸载
  11. 天视通ipc地址修改工具_远程运行小工具PsExec
  12. conda 虚拟环境内安装git_用anaconda创建的虚拟环境安装FALCON
  13. 【概率统计】(在更)
  14. mapbox创建空白底图
  15. [15元]人体行为检测和识别毕业论文讲述
  16. BUUCTF之[Zer0pts2020]Can you guess it? basename函数绕过
  17. Ubuntu 19.04初体验
  18. 《自控力》直面自身欲望,但不要付诸行动
  19. 高级测试开发进阶知识详解
  20. 如何写一份让 HR 眼前一亮的简历(附模板)

热门文章

  1. Change 改变事件
  2. 计算机专业的硕士犯罪,计算机犯罪研究
  3. UI设计学习流程写给零基础学习的你
  4. 2020年之HBuilderX manifest.json配置最全详解
  5. 洛谷P2634 [国家集训队]聪聪可可(点分治)
  6. surrogate function
  7. python 文件和文件夹操作
  8. sm4 的s盒_商密算法SM2、SM3、SM4的用途和原理
  9. Tuxera NTFS for Mac2020注册机
  10. sdut 1309 不老的传说问题(区间DP,难,值得好好看)