1、什么是单例模式:
一个类在任何情况下只有一个实例,并提供一个全局访问点
特点:构造方法私有化
2、单例模式有哪些:饿汉、懒汉、注册式单例
(1)饿汉模式
直接实例化一个对象
优点:执行效率高,可以直接创建实例
缺点:在一定情况下,会造成内存资源浪费
public class HungrySingleton {
private static final HungrySingleton hungrySingleton = new HungrySingleton();
private HungrySingleton(){
}
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}
(2)懒汉模式
在需要的时候创建实例
优点:合理的安排了资源
缺点:线程不安全(通过双重锁和内部类可以解决)
public class LazySingleton {
public static LazySingleton lazySingLeton=null;
private LazySingleton(){};
/**
* 懒汉模式
* 优点:使用时创建,不浪费资源内存
* 缺点:线程不安全
* @return
*/
public static LazySingleton getInstance(){
if(null == lazySingLeton){
lazySingLeton = new LazySingleton();
}
return lazySingLeton;
}
/**
* 双重锁
* 优点:线程安全、性能高、使用时创建不浪费资源内存
* 缺点:代码不够优雅
* @return
*/
public static LazySingleton getInstanceSynchronized(){
if(null == lazySingLeton){
synchronized (LazySingleton.class){
if(null == lazySingLeton){
lazySingLeton = new LazySingleton();
}
}
}
return lazySingLeton;
}
}
内部类方法
public class LazyInsideClassSingleton {
private LazyInsideClassSingleton(){
if(ClassSingleton.LAZY_INSIDE_CLASS_SINGLETON != null){
System.out.println("不允许非法访问");
}
};
public static LazyInsideClassSingleton getInstance(){
return ClassSingleton.LAZY_INSIDE_CLASS_SINGLETON;
}
private static class ClassSingleton{
public static LazyInsideClassSingleton LAZY_INSIDE_CLASS_SINGLETON = new LazyInsideClassSingleton();
}
}
(3)注册单例
枚举模式:将每一个单例缓存到统一的容器内,通过统一标识获取单例
public enum EnumSingleton {
INSTANCE;
private Object data;
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static EnumSingleton getInstance(){
return INSTANCE;
}
}
来源:CSDN
作者:zhang2383906154
链接:https://blog.csdn.net/zhang2383906154/article/details/104558353