一、类图
二、模式含义
单例模式(Singleton Pattern):单例模式是一种对象创建型模式。
1、确保某一个类只有一个实例
2、自行实例化并向整个系统提供这个实例,这个类称为单例类,
3、它提供全局访问的方法。
三、代码实现
1、饿汉模式
package com.yan.pattern.singleton.ehan;
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {//私有构造器防止 直接new
}
public static Singleton getInstance() {
return instance;
}
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2);
}
}
2、懒汉模式
package com.yan.pattern.singleton.lanhan;
public class Singleton {
// 注意有volatile
private volatile static Singleton instance = null;
private Singleton() {// 私有构造器防止 直接new
}
public static Singleton getInstance() {
// 双重锁------双重检查锁定(Double-Check Locking)
if (instance == null) {
synchronized (Singleton.class) {// 同步操作,防止多次创建
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2);
}
}
3、静态内部类模式
package com.yan.pattern.singleton.innoclass;
public class Singleton {
private Singleton() {//私有构造器防止 直接new
}
private static class HolderClass {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2);
}
}
四、总结
个人悟出的道理
记住一句话,很好三种方式都记住——1.防(防止直接new),2.建,3.给
1.防:防止直接new出对象,这样就不是单例了
2.建:既然不能new出对象,那就内部提供方式(成员变量方式?成员方法方式?内部类方式?)
3.给:提供共有的方式供应实例