单例模式目的:
保证一个类仅有一个实例。
单例类拥有一个私有构造函数,确保用户无法通过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();
}
}