什么是单例模式?

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例场景,也就是说:确保某个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象应该有且只有一个。

UML类图:

构建单例模式的关键:

1.构造函数不对外开放,一般为Private

2.通过一个静态方法或者枚举返回单例类对象

3.确保单例类的对象有且只有一个,尤其是多线程的环境下

4.确保单例类对象在反序列化时不会重新构建对象

单例模式构建方式:

1.饿汉模式

2.懒汉模式(Double Check)

3.静态内部类的单利模式

4.枚举单例模式

5.容器实现单例模式

代码示例:

1.饿汉模式

  1. public class Singleton {
  2. private Singleton(){
  3. }
  4. private static final Singleton Instance=new Singleton();
  5. public Singleton getInstance(){
  6. return Instance;
  7. }
  8. }

2. 懒汉模式(Double Check)

  1. public class Singleton {
  2. private Singleton(){
  3. }
  4. private static Singleton Instance=null;
  5. public Singleton getInstance(){
  6. if(Instance==null){
  7. synchronized (Singleton.class) {
  8. if(Instance==null)
  9. {
  10. Instance=new Singleton();
  11. return Instance;
  12. }
  13. }
  14. }
  15. return Instance;
  16. }
  17. }

3.静态内部类单例模式

  1. public class Singleton {
  2. private Singleton(){}
  3. private static Singleton getInstance(){
  4. return SingletonHolder.Instance;
  5. }
  6. /**
  7. * 静态内部类
  8. */
  9. private static class SingletonHolder{
  10. private static final Singleton Instance = new Singleton();
  11. }
  12. }

当第一次加载Singleton类时,并不会初始化Instance,只有在第一次调用Singleton的getInstance方法时,才会导致
Instance 被初始化。第一次调用 getInstance
方法会导致虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例对象的实例化,所以推荐使用这种方法。

4.枚举单例

  1. public enum SingletonEnum{
  2. INSTANCE;
  3. public void doSomething(){
  4. System.out.println("do sth.");
  5. }
  6. }

5.使用容器实现单例模式

  1. public class SingletonManager {
  2. private static Map<String, Object> objMap = new HashMap<String, Object>();
  3. private SingletonManager(){ }
  4. //将多种单例类型注入到一个统一的管理类,在使用时根据key获取对象对应类型的对象
  5. public static void registerService(String key, Object instance)
  6. {
  7. if(!objMap.containsKey(key)){
  8. objMap.put(key, instance);
  9. }
  10. }
  11. public static Object getService(String key){
  12. return objMap.get(key);
  13. }
  14. }

这种容器单例模式的实现,在Android中,我们使用的Context的getSystemService(key)的方式,就是利用的容器单例模式。eg:WIndowsManagerService、ActivityManagerService等等。在虚拟机第一次加载该类时,会注册各种Service,这些服务以键值对的形式存储在一个HashMap中,用户使用时只需要根据key来获取到对应的具体服务对象了。

java单例模式实例的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  7. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  8. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  9. 你真的理解了java单例模式吗?讲别人都忽略的细节!

    前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...

随机推荐

  1. YOLOv2训练自己的数据集(VOC格式)

    下周试试,参考:http://blog.csdn.net/ch_liu23/article/details/53558549 http://blog.csdn.net/sinat_30071459/a ...

  2. ConvertUtils.register的作用

    BeanUtils的populate方法或者getProperty,setProperty方法其实都会调用convert进行转换 但Converter只支持一些基本的类型,甚至连Java.util.D ...

  3. 002_JavaSE笔记:单例模式

    一.应用杨景 在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer ...

  4. Java第三阶段学习(十二、HttpServletRequest与HttpServletResponse)

    一.HttpServletRequest 1.概述: 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和 ...

  5. 【LOJ】#2509. 「AHOI / HNOI2018」排列

    题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该 ...

  6. Successor hdu 4366 线段树

    题意: 现在n个人,其中编号0的是老板,之后n-1个员工,每个员工只有一个上司,有一个忠诚值和能力值.每次要解雇一个人的时候,从他的下属中选取能力值大于他的且忠诚值最高的一个,若不存在则输出-1.共m ...

  7. 那些年我们踩过的坑之表单reset

    开发者往往是在一个又一个的坑中成长起来的,自学的开发者尤其如此,刚刚填完一个坑,转身又掉进另一个坑.有些坑很容易就跳出来了,也有些坑能整了一天都没头绪,第二天早上一来发现后面就有一架通往坑外的梯子,坑 ...

  8. linux学习笔记-7.文件属性

    1.查看文件夹属性 ls -ld test 2.文件夹的rwx --x:可以cd进去r-x:可以cd进去并ls-wx:可以cd进去并touch,rm自己的文件,并且可以vi其他用户的文件-wt:可以c ...

  9. 【Ray Tracing in One Weekend 超详解】 光线追踪1-7 Dielectric 半径为负,实心球体镂空技巧

    今天讲这本书最后一种材质 Preface 水,玻璃和钻石等透明材料是电介质.当光线照射它们时,它会分裂成反射光线和折射(透射)光线. 处理方案:在反射或折射之间随机选择并且每次交互仅产生一条散射光线 ...

  10. Java 操纵XML之读取XML文件

    Java 操纵XML之读取XML文件 一.JAVA DOM PARSER DOM interfaces The DOM defines several Java interfaces. Here ar ...