设计模式-单例模式

来源:互联网 发布:交大知行大厦地址 编辑:程序博客网 时间:2024/06/08 08:47

描述

单例模式是我们最常见也是最简单的一种设计模式,当一个系统只需要一个类的一个实例,并且希望这个实例可以在很多地方访问,这时候,就需要单例模式了。
实现单例模式的要点有三个:
1.构造函数必须是private的
2.指向自己实例的私有static引用
3.以自己实例为返回值的static的公有的方法

实现

饿汉模式

public class Singleton {      private static Singleton singleton = new Singleton();      private Singleton(){ }      public static Singleton getInstance(){          return singleton;      }    // 其他……}  

从中可以看到,这种在类加载的时候就实例化的方式,优点是避免了多线程访问时候的安全问题,缺点是不论会不会使用到,都会实例化。

懒汉模式

    public class Singleton {        private static Singleton instance = null;        private Singleton(){ };        public static Singleton getInstance() {            if(instance == null) {                synchronized(Singleton.class) {                    if(instance == null) {                        instance = new Singleton();                    }                }            }            return instance;        }    }

这个就是懒汉模式,这里面涉及到一个double-cheched-locking(双重检查锁定),可以参考:http://ifeve.com/doublecheckedlocking/,这个在jdk1.5之后才会是线程安全的。

懒汉模式二

一种完美实现的实现既线程安全又延迟加载的模式(Initialization on demand holder)使用静态内部类:

public class Singleton {    private Singleton(){ };    private static class SingletonHold {        private static final Singleton instance = new Singleton();    }        Public static Singleton getInstance(){        return SingletonHold.instance;    }}

这样就能保证在第一次调用getInstance()方法时,才会去初始化instance实例,而且该实例被定义为static,只会被初始化一次。

0 0