单例模式:
主要是为了避免因为创建了多个实例造成资源的浪费(当创建对象时资源消耗较大的类),且多个实例由于多次调用容易导致结果出现错误(硬件资源资源访问或者数据文件同步调用时候),而使用单例模式能够保证整个应用中有且只有一个实例。从其名字中我们就可以看出所谓单例,就是单个实例也就是说它可以解决的问题是:可以保证一个类在内存中的对象的唯一性,在一些常用的工具类、线程池、缓存,数据库,账户登录系统、配置文件等程序中可能只允许我们创建一个对象,一方面如果创建多个对象可能引起程序的错误,另一方面创建多个对象也造成资源的浪费。在这种基础之上单例设计模式就产生了因为使用单例能够保证整个应用中有且只有一个实例,看到这大家可能有些疑惑,没关系,我们来举一个例子,相信看完后你就会非常明白,为什么会有单例。
- 在一个应用中一个类只有一个实例,避免了重复创建,即节省资源以及加快了对象的创建时间,优化了使用速度。
2.主要使用者资源消耗型和有序性设备管理器,控制器的类适合单例模式,例如配置文件,数据库访问,缓存,登录账户系统等工具类;
3.单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;能够避免由于操作多个实例导致的逻辑错误。如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用,那么单例模式也许是一个值得考虑的选择。
单例模式主要追求三个方面性能:
线程安全
调用效率高
延迟加载
单例模式主要构造方法:
- 懒汉式
延迟加载,优化资源使用,使用时初始化,可以传入参数
public class Singleton{//线程安全的
private static volatile Singleton mInstance = null;
private Object lock = new Object();
private Singleton(){};
private static Singleton getInstance(){
if(mInstance == null){//双重检测+内部检测
synchronized(lock){
if(mInstance == null){
mInstance = new Singleton();
}
}
}
return mInstance;
}
}
静态内部类方式:
因为静态嵌套类是依附于外部类而非外部类对象的,所以不同的外部类对象共享一个静态嵌套类
public class Singleton{
private static class SingletonHolder(){
public static Singleton mInstance = new Singleton();
}
private Singleton(){};
private static synchronized Singleton getInstance(){
return SingletonHolder.mInstance;
}
}
饿汉式:
类加载时候创建类的实例,所有是多个对象共享的天生线程安全,调用速度快
public class Singleton{//线程安全的
private static Singleton mInstance = new Singleton();
private Singleton(){};
private static Singleton getInstance(){
return mInstance;
}
}
饿汉式与懒汉式区别:
- 饿汉式:
优点:类加载时候创建类的实例,所有是多个对象共享的天生线程安全,调用速度快。
缺点:但是创建即加载会造成资源浪费,在单例数量较多时候会造成加载慢。
瓶颈:在获取单例时候如果传入参数,则不能使用
2.懒汉式存在线程安全问题(双重检测+内部检测解决),是在使用时候创建即延时加载,降低了资源的消耗。
饿汉式与懒汉式缺点,在反射和序列化时候创建多个对象;
枚举类单例模式: