A. 简单饿汉单例模式
/**
* @author xiyou
* 最简单的饿汉单例
*/
public class SimpleHungrySingleton {
//类加载的时候,单例已经创建
private static SimpleHungrySingleton SIMPLE_HUNGRY_INSTANCE = new SimpleHungrySingleton();
//构造函数私有化
private SimpleHungrySingleton() {
}
//提供全局访问点
public static SimpleHungrySingleton getEhanMonitor() {
return SIMPLE_HUNGRY_INSTANCE;
}
}
- A是最简单的恶汉单例模式
- 也不会存在线程安全问题
- 但是为什么有时候不使用这个呢?
- 因为它不像懒汉模式是延迟加载,所谓延迟加载就说需要使用的时候才创建
- 其实还有一点为什么大部分不用恶汉,比如传参数的问题。
- 加入一个对象的创建需要传一个参数,满足要求的时候再创建,恶汉就做不到了
A1 简单饿汉单例的变种
/**
* @author xiyou
* SimpleHungrySingleton的变种,其实它一样,没啥区别,就是在构造函数里面初始化
*/
public class StaticHungrySingleton {
//类加载的时候,单例已经创建
private static StaticHungrySingleton STATIC_HUNGRY_INSTANCE;
//静态代码块,其实没啥用,只是spring先属性后方法,先静态后动态,先上后下
private StaticHungrySingleton() {
STATIC_HUNGRY_INSTANCE = new StaticHungrySingleton();
}
//提供全局访问点
public static StaticHungrySingleton getEhanMonitor() {
return STATIC_HUNGRY_INSTANCE;
}
}
B. 带有全局变量的饿汉模式
/**
* xiyou-todo B恶汉模式
* 1. 如果在恶汉单例模式里面添加一个它的全局属性
* 2. 如果想获取它的yourClass 可以调用直接调用yourClass
* 3. 但是这样对象还是会初始化,会进行构造方法初始化
* 4. 但是也只会初始化一次
*/
public class StaticPropertyHungry {
/**
* todo-xiyou 饿汉模式
* 1. 如果在饿汉单例模式里面添加一个它的全局属性
* 2. 如果想获取它的yourClass 可以调用直接调用yourClass
* 3. 但是这样对象会使当前对象初始化(构造方法初始化,虽然指挥初始化一次),但我还是不想让类初始化怎么办
* 4.
*/
public static final String YOUR_PROPERTY = "xiyou";
private static StaticPropertyHungry classMonitor = new StaticPropertyHungry();
private StaticPropertyHungry() {
System.out.println("饿汉模式:构造方法初始化,只会初始化一次" + YOUR_PROPERTY);
}
public static StaticPropertyHungry getClassMonitor() {
System.out.println("饿汉模式,获取对象" + classMonitor);
return classMonitor;
}
public static void main(String[] args) {
System.out.println(StaticPropertyHungry.YOUR_PROPERTY);
System.out.println(StaticPropertyHungry.YOUR_PROPERTY);
System.out.println("上面是只调用单例模式的属性,但是也会进行类的初始化");
System.out.println(StaticPropertyHungry.YOUR_PROPERTY + getClassMonitor());
System.out.println(StaticPropertyHungry.YOUR_PROPERTY + StaticPropertyHungry.getClassMonitor());
}
}
结果:发现调用内部属性会进行类的初始化,虽然只会初始化一次
饿汉模式:构造方法初始化,只会初始化一次xiyou
xiyou
xiyou
上面是只调用单例模式的属性,但是也会进行类的初始化
饿汉模式,获取对象cn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
xiyoucn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
饿汉模式,获取对象cn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
xiyoucn.net.health.tools.design.singleton.StaticPropertyHungry@783e6358
C 如何获取类的全局变量但是不进行类初始化?
如果还想获取内部的属性,但是还不想进行初始化,所有B就不适合了,那用什么呢?静态内部类实现的单例模式可以解决,嘿嘿!
参见:静态内部类实现单例模式