先来介绍一下设计模式:它是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。设计模式更多的是停留在思想层面,指导我们提高编码的效率和质量。
使用设计是为了可重用代码,让代码更容易被他人理解,保证代码的可靠性。
单例模式:
在我们的开发过程中,有些对象我们只需要一个,例如:配置文件,工具类,线程池,缓存,日志对象等。
如果创建多个实例,就会导致很多问题,比如占用过多资源,获取内容不一致的问题,为了保证整个应用中的实例有且只有一个,便要用到单例模式。
单例模式有两种实现方式,懒汉模式和饿汉模式
饿汉模式:
<span style="font-size:18px;">public class Singleton
{
//1.将构造器私有化,不允许外部直接创建对象
private Singleton(){}
//2.创建类的唯一实例,为保证类的封装特性,要将其私有化
private static Singleton instance = new Singleton();
//3.给外部提供一个静态方法,可以获取该唯一实例
public static Singleton getInstance()
{
return instance;
}
}</span>
通过这种方式,可以保证外部获得的实例对象为同一个。
之所以称其为饿汉模式,是因为这个唯一的实例对象实在类加载的时候就被创建了,也就是着急吃饭,即为饿汉模式
懒汉模式:
<strong><span style="font-size:18px;">public class Singleton2
{
//1.将构造器私有化,不允许外部直接创建对象
private Singleton2(){}
//2.声明类的唯一实例,为保证类的封装特性,要将其私有化,与饿汉模式不同的是,
// 此处只是声明对象,并未将其实例化
private static Singleton2 instance;
//3.给外部提供一个静态方法,可以获取该唯一实例
public static Singleton2 getInstance()
{
if(instance==null)
{
instance = new Singleton2();
}
return instance;
}
}</span></strong>
这种方式通过判断实例是否为空来决定是否需要创建实例,当第一次调用该方法时会创建实例,之后便只需直接应用第一次创建的实例即可。
饿汉模式和懒汉模式的区别:
饿汉模式中实在类加载时就创建实例对象,所以加载阶段比较慢,运行阶段之间使用已经创建好的实例,所以会比较快。与之相反
懒汉模式是在运行阶段才创建类的唯一实例,所以运行阶段比较慢,而类加载阶段比较快
另一个重要的区别是,饿汉模式是线程安全的,而懒汉模式是线程不安全的。