设计模式之单例模式

99 阅读2分钟

单例模式的介绍

单例模式是java里面设计模式之一,是一个比较简单的设计模式,并且是一个用的比较多的设计模式。单例模式属于创建型模式。单例模式顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,不需要实例化该类的对象。其核心就是:构造方法私有化。

单例模式的几种写法

1、懒汉式(线程不安全)

最基础的实现方式 不支持多线程 线程不安全

public class Singleton{
    //创建对象
    private static Singleton instance;
    //构造函数私有化 这样类就不会被实例化了
    private Singleton(){}
    //判断是否存在 根据判断的结果来决定是否获取对象
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton;
        }
        return instance;
    }
}

2、懒汉式(线程安全)

public class Singleton{
    //创建对象
    private static Singleton instance;
    //构造函数私有化 这样类就不会被实例化了
    private Singleton(){}
    //判断是否存在 根据判断的结果来决定是否获取对象
    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton;
        }
        return instance;
    }
}

3、饿汉式(线程安全)

饿汉式,从名字上也很好理解,就是“比较勤”,实例在初始化的时候就已经建好了,不管你有没有用到,都先建好了再说。好处是没有线程安全的问题,坏处是浪费内存空间。

public class Singleton{
    //创建对象
    private static Singleton instance = new instance();
    //构造函数私有化 这样类就不会被实例化了
    private Singleton(){}
    //直接返回对象
    public static synchronized Singleton getInstance(){
        return instance;
    }
}

4、懒汉式(双捡锁)

双检锁,又叫双重校验锁,综合了懒汉式和饿汉式两者的优缺点整合而成。看上面代码实现中,特点是在synchronized关键字内外都加了一层 if 条件判断,这样既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。

public class Singleton{
    //创建对象
    private static Singleton instance;
    //构造函数私有化 这样类就不会被实例化了
    private Singleton(){}
    //
    public static synchronized Singleton getInstance(){
        if(instance == null){
            synchronized(Singliton.class){
                if(instance == null ){
                    instance = new Singleton;
                }
            }
        }
        return instance;
    }
}

5、静态内部类

静态内部类的方式效果类似双检锁,但实现更简单。但这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用

public class Singleton{
    private static class SingletonHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton(){}
    public static final Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

6、枚举

枚举的方式是比较少见的一种实现方式,但是看上面的代码实现,却更简洁清晰。并且她还自动支持序列化机制,绝对防止多次实例化。

public enum Singleton{
    INSTANCE;
    public void anyMrthod(){
    }
}