乐趣区

关于学习:设计模式创建型单例模式

介绍

单例模式是一种创立型设计模式 ????,可能保障一个类只有一个实例,并提供一个拜访该实例的全局节点。

特点

  • 保障一个类只有一个实例。最常见的起因是管制某些共享资源,例如数据库或文件的拜访权限。它的运作形式是这样的,如果此时你创立了一个对象,过一会你决定再创立一个对象,然而此时你会取得方才曾经创立好的对象,而不会产生一个新对象。⚠️ 要留神的是,一般构造函数无奈实现,构造函数的设计决定了它肯定要产生一个新对象。
  • 为该实例提供一个全局拜访节点,单例模式容许在程序任何中央拜访特定对象。然而它能够爱护该实例不会被其余代码所笼罩。

解决方案

将默认构造函数设置为公有,避免其余对象应用单例类的 new 关键字进行实例化。

新建一个动态构造方法作为构造函数。该函数会调用公有构造函数来创建对象,无论何时调用该办法,它总是会返回雷同的对象。

public class Singleton {

    public static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        ...
        ...
        ...
    }
}

懒汉模式

public static Singleton getInstance() {if (Objects.isNull(instance)) {instance = new Singleton();
    }
    return instance;
}

这种形式实现起来非常简略,然而如果多线程拜访单例对象,无奈保障线程平安。

public static synchronized Singleton getInstance() {if (Objects.isNull(instance)) {instance = new Singleton();
    }
    return instance;
}

应用 synchronized 关键字管制多线程拜访,同一时刻只有一个线程能够进入代码块,确保了线程平安。然而这种形式会升高程序运行效率。

public static Singleton getInstance() {if (Objects.isNull(instance)) {synchronized (Singleton.class) {if (Objects.isNull(instance)) {instance = new Singleton();
            }
        }
    }
    return instance;
}

应用双重校验的形式,既确保了线程平安,也不会影响程序运行效率。然而有呈现空指针的危险。

public static Singleton getInstance() {return StaticSingletonHolder.INSTANCE;}

private static class StaticSingletonHolder {private static final Singleton INSTANCE = new Singleton();
}

应用动态外部类的形式,确保不会反复创建对象,也不会影响程序效率。并且还是懒加载的形式,内存方面也解决的十分好。

饿汉模式

private static final Singleton INSTANCE = new Singleton();

public static Singleton getInstance() {return INSTANCE;}

应用 final 动态成员变量,当类第一次加载到内存中的时候就实现了初始化,保障了线程平安。

public static SingletonUsingEnum getInstance() {return SingletonUsingEnum.INSTANCE;}

private enum SingletonUsingEnum {INSTANCE;}

应用枚举的形式,能够保障不会反复创建对象,线程平安。还能够防止反射和序列化等带来的问题。是实现单例模式最好的形式。

总结

这是重新学习单例模式的笔记,其中可能有很多中央写的不对,写得不好,欢送大家斧正 ????。

退出移动版