GoF23-单例(Singleton)模式
目标之一:提高程序的可复用性
设计模式三连
有哪些功能可以被扩展?
扩展功能时必须修改哪些地方?
有哪些类不需要修改?
关键
保证在JVM中只有一个实例。
懒汉式
需要该对象时,new实例对象。不安全
class Singleton{
private static Singleton singleton;
/**
* 构造函数私有化,解决在一个jvm中只能有一个实例的问题。 不能无限初始化对象。
* 反射也不能初始化
*/
private Singleton() {
}
/**
* 当需要时才实例化,之后都是一个实例。懒汉式不安全,所以需要加上同步。
*
* @return
*/
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
/**
* @description:单例模式-懒汉式
* @author: LiShun
*/
public class Test{
/**
* 判断是否使用的一个实例
*
* @param args
*/
public static void main(String[] args) {
Singleton instance = Singleton.getInstance();
Singleton instance1 = Singleton.getInstance();
System.out.println(instance == instance1);
}
}
饿汉式
天生安全,在类加载时就初始化了一个实例对象。
Spring框架IOC容器中的对象默认就是饿汉式单例。
class Singleton2{
// 类加载时就初始化了
private static Singleton2 singleton2=new Singleton2();
/**
* 构造函数私有化,解决在一个jvm中只能有一个实例的问题。 不能无限初始化对象。
* 反射也不能初始化
*/
private Singleton2() {
}
public static Singleton2 getInstance() {
return singleton2;
}
}
/**
* @description:单例模式-饿汉式
* @author: LiShun
*/
public class Test2 {
/**
* 判断是否是使用一个实例
*
* @param args
*/
public static void main(String[] args) {
Singleton2 instance = Singleton2.getInstance();
Singleton2 instance1 = Singleton2.getInstance();
System.out.println(instance == instance1);
}
}
设计模式是内功,需要一直修炼!