Python 5 中的 种单例模式实现方式 探索 (python怎么读)
本文目录导航:
探索 Python 中的 5 种单例模式实现方式
单例模式确保类只存在一个实例,适用于需全局访问点的场景。
模块级别的变量实现单例,由于模块在程序中只导入一次,故能获取单例对象,方法直观,适用于简单需求。
利用类的__new__方法实现单例,先执行类的__new__方法生成实例,再执行__init__方法初始化,此方法推荐,能通过类名()直接实例化对象。
通过装饰器实现单例,更灵活,适用于需更多控制的场景。
使用类实现单例需注意多线程问题,通过加锁解决,确保在创建对象过程中不会同时创建多个实例。
元类实现单例,允许在创建类时动态修改定义,确保类只有一个实例。
总结,单例模式提供全局访问点,实现方法需根据具体需求选择。
多线程下需注意实例化问题,通过加锁等手段解决。
推荐使用__new__方法实现单例,灵活且易于实例化。

面试突击50:单例模式有几种写法?
单例模式是面试中的常客了,它的常见写法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举,接下来我们一一来看。
1.饿汉模式饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.通过私有变量保存单例对象private static Singleton instance = new Singleton();// 3.提供公共获取单例对象的方法public static Singleton getInstance() {return instance;}}
优点:实现简单、不存在线程安全问题。
缺点:类加载时就创建了对象,创建之后如果没被使用,就造成了资源浪费的情况。
懒汉模式和饿汉模式正好是相反的,所谓的懒汉模式也就是懒加载(延迟加载),指的是它只有在第一次被使用时,才会被初始化,它的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.通过私有变量保存单例对象private static volatile Singleton instance = null;// 3.提供公共获取单例对象的方法public static Singleton getInstance() {if (instance == null) { // 第一次效验synchronized () {if (instance == null) { // 第二次效验instance = new Singleton();}}}return instance;}}懒汉模式使用的是双重效验锁和 volatile 来保证线程安全的,从上述代码可以看出,无论是饿汉模式还是懒汉模式,它们的实现步骤都是一样的:
创建一个私有的构造方法,防止其他调用的地方直接 new 对象,这样创建出来的对象就不是单例对象了。
创建一个私有变量来保存单例对象。
提供一个公共的方法返回单例对象。
懒汉模式相比于饿汉模式来说,不会造成资源的浪费,但写法要复杂一些。
3.静态内部类静态内部类既能保证线程安全,又能保证懒加载,它只有在被调用时,才会通过 ClassLoader 机制来加载和初始化内部静态类,因此它是线程安全的,此模式的实现代码如下:
public class Singleton {// 1.防止外部直接 new 对象破坏单例模式private Singleton() {}// 2.静态内部类private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}// 3.提供公共获取单例对象的方法public static final Singleton getInstance() {return ;}}4.枚举枚举也是在第一次被使用时,才会被 Java 虚拟机加载并初始化,所以它也是线程安全的,且是懒加载的,它的实现代码如下:
public enumEnumSingleton {INSTANCE;public EnumSingleton getInstance(){return INSTANCE;}}总结
单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。
单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。
从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java面试真题解析
面试合集:原文:
单例模式的应用场景有哪些
单例模式在软件开发中有着广泛的应用场景,尤其是在需要确保全局唯一性的场合。
例如,在开发一个串口通信类时,通常会选择使用单例模式。
这是因为,在实际程序运行过程中,同一个串口设备不允许被重复打开。
通过采用单例模式,可以在代码层面有效地避免这一问题,确保程序中串口设备的唯一性。
单例模式还常用于数据库连接管理。
在许多应用程序中,数据库连接是资源密集型操作,频繁创建和销毁连接会消耗大量系统资源。
通过将数据库连接封装为单例模式,可以实现资源的高效利用,避免频繁创建和销毁连接带来的性能损耗。
此外,日志记录也是单例模式的一个典型应用。
在一个大型系统中,日志记录对于调试和监控至关重要。
通过使用单例模式,可以确保整个系统中只有一个日志记录实例,避免了日志记录中的重复和冲突问题。
同时,这也有助于更好地管理和控制日志输出的格式和内容。
单例模式还可以用于实现全局配置管理。
在软件开发中,全局配置信息往往需要在整个应用程序中共享。
通过将配置信息封装为单例模式,可以确保这些配置信息在整个应用程序中的唯一性和一致性。
这不仅简化了配置管理的复杂度,还提高了程序的可维护性和可扩展性。
另外,一些工具类也可以采用单例模式来实现。
工具类通常包含一些常用的辅助方法,如字符串处理、日期格式化等。
通过将这些工具类封装为单例模式,可以确保在整个程序中这些方法的一致性和高效性,避免了重复创建和销毁工具类实例带来的性能开销。
总结起来,单例模式在软件开发中有着广泛的应用场景,它不仅可以确保全局唯一性,还可以提高资源利用效率和程序的可维护性。
通过合理地使用单例模式,可以有效地解决许多常见的编程问题,提升软件的质量和性能。