单例模式是设计模式的一种。
设计模式:设计模式是一种思想,是一种编程思想,是一套被反复使用的、多数人知晓的代码设计经验的总结。
单例模式概念:在做某个项目中,创建了一个类,无论使用该类方法多少次,都只产生一个该类对象。
单例模式有多种实现方式分别是:饿汉式,懒汉式,静态内部类,枚举。
一.饿汉式
饿汉式:只要类一加载就会创建了对象,类加载时会直接实例化对象,以后都会返回该对象的引用。
实现步骤:
1:构造函数私有化
2:提供一个静态对象属性用来接收对象
3:创建一个静态方法用来获取对象实例
举例代码如下
public class Single{
private Single(){}
private static Single single = new Single();
public static Single getInstance(){
return single;
}
}
饿汉式的优点:没有加锁,执行效率高,线程安全的实例。
饿汉式的缺点:类加载时,不管有没有用到该对象,都会直接实例化单例对象,浪费内存。
二.懒汉式
懒汉式:在调用创建对象实例的方法时才会创建对象,不会随着类的加载而加载
实现步骤:
1.构造方法需要私有化 2.提供一个静态属性 3.提供一个方法用来创建对象
举例代码如下:
public class Single{
private Single(){}
private static Single single;
public static Single getInstance(){
if (single == null){
synchronized(Single .class){
if (single == null){
single = new new Single();
}
}
}
return single;
}
}
本段代码中有双重检验,首先判断实例是否为null,为null则使用synchronized锁住类,然后在同步块中,再一次判断实例是否为null,为null则初始化实例对象。
懒汉式的优点:只有在用到对象时,才会创建对象,不会浪费内存。
缺点:单线程情况下,是安全的,但是在多线程下,多个线程可能同时执行singleton == null
三.静态内部类
通过静态内部类,完成单例模式的创建,在外部类加载时,并不会加载内部类,也就是不会实行new ()实例化,这属于懒加载,只有第一次调用getInstance方法时才会加载。
举例代码如下:
public class InnerSingleton{
private InnerSingleton(){}
private static class Inner{
private static InnerSingleton instance =new InnerSingleton();
}
public static InnerSingleton getInstance(){
return Inner.instance;
}
}
四.通过枚举创建单例模式
枚举常用于类的对象有有限个、确定的类。比如说,星期的定义,当需要定义一组常量时,强烈建议使用枚举类。
单例使用的范围也非常的广,如果说mybatis对象的创建等。这里我们主要演示,用枚举创建单例模式的过程。
public class Single {
private Single(){
}
private static enum Singleton{
INSTANCE;
private Single es=new Single();
}
public static Single getInstance(){
return Singleton.INSTANCE.es;
}
}
因为枚举的性质,INSTANCE 又是由final static 修饰的,所以我们用enum来创建单例。而JVM来管理这个实例,又保证了线程安全,所以通过enum来创建单例对象是可行的。
以上就是创建单例模式的四种方式,若有不足,烦请补充。