1. 说明
1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例;
2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象);
3)单例模式要素:
a)私有构造方法
b)私有静态引用指向自己实例
c)以自己实例为返回值的公有静态方法
2.实例
1)饿单例模式:
package com.yuxuange.singletondemo;
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
System.out.println("这是HungrySingleton输出的"); //使用时注释掉
return instance;
}
}
2)懒单例模式:
package com.yuxuange.singletondemo;
public class LazySingleton {
private LazySingleton(){
}
private static LazySingleton instance;
public static synchronized LazySingleton getInstance(){
if(instance == null){
instance = new LazySingleton();
System.out.println("这是LazySingleton输出的"); //使用时注释掉
}
return instance;
}
}
3)测试类 TestSingleton
package com.yuxuange.singletondemo;
public class TestSingleton {
public static void main(String[] args) {
HungrySingleton s1 = HungrySingleton.getInstance();
LazySingleton s2 = LazySingleton.getInstance();
}
}
输出结果:
3.优点和适用场景
1)单例模式的优点:
a)在内存中只有一个对象,节省内存空间。
b)避免频繁的创建销毁对象,可以提高性能。
c)避免对共享资源的多重占用。
d)可以全局访问。
2)适用场景:
a)需要频繁实例化然后销毁的对象。
b)创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
c)有状态的工具类对象。
d)频繁访问数据库或文件的对象。
4.使用时注意事项
1)使用时不能用反射模式创建单例,否则会实例化一个新的对象
2)使用懒单例模式时注意线程安全问题
3)饿单例模式和懒单例模式构造方法都是私有的,因而是不能被继承的,有些单例模式可以被继承。