单例模式目的:
保证一个类仅有一个实例。
单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化类。
单例模式实现过程注意三点:
1、单例类的构造函数为私有;
2、提供一个自身的静态私有成员变量;
3、提供一个公有的静态工厂方法。
适用环境:
系统要求提供一个唯一的序列号生成器;
客户调用类的单个实例只允许适用一个公共访问节点,除了该公共访问点不能通过其他途径访问该实例。
等等。
例子代码:
经典式单例:
public class SinglePattern { private SinglePattern() { } private static SinglePattern instance; //加入synchronized同步是为了线程安全 public static synchronized SinglePattern getInstance() { if (instance == null) { instance = new SinglePattern(); } return instance; } }
类加载开始就实例化(线程安全):
public class SinglePattern { private SinglePattern() { } private static SinglePattern instance = new SinglePattern(); public static SinglePattern getInstance() { return instance; } }
双重检查锁定单例:
public class SinglePattern { private SinglePattern() { } private static SinglePattern instance; //双重检查锁定 public static SinglePattern getInstance() { if (instance == null) { synchronized (SinglePattern.class) { if (instance == null) { instance = new SinglePattern(); } } } return instance; } }
public class SinglePattern { private SinglePattern() { } //静态内部类 private static class Holder { private final static SinglePattern INSTANCE = new SinglePattern(); } public static final SinglePattern getInstance() { return Holder.INSTANCE; } }
用户类调用单例类:
public class SinglePatternTest { public static void main(String[] args) { SinglePattern.getInstance(); } }