首页 > 其他分享 >学习之面试题:单例模式

学习之面试题:单例模式

时间:2024-10-13 17:49:47浏览次数:10  
标签:__ 面试题 Singleton 模式 instance 单例 ._ cls

什么是单例模式?

单例模式是一种设计模式,它保证一个类仅有一个实例,并提供一个全局访问点用于访问该实例。其主要目的是控制共享资源的访问。

为什么我们需要单例模式?

单例模式可以用于控制资源的消耗,避免频繁创建和销毁对象,同时也可以简化系统配置,使得某些类的对象在整个系统中具有唯一的实例,比如日志对象、数据库连接等。

如何在 Python 中实现单例模式?

下面是一些常见的实现方式:

方法一:使用模块
Python 模块本身就是单例的,所以在一个模块中定义的类可以被多个脚本共享。

方法二:使用 __new__ 方法
重写类的 __new__ 方法来控制实例的创建过程,确保只创建一次实例。

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

singleton_instance = Singleton()


方法三:使用装饰器
可以创建一个装饰器来管理单例逻辑。

def singleton(cls):
    instances = {}
    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance

@singleton
class MyClass(object):
    pass

my_instance = MyClass()
方法四:使用元类(MetaClass)
利用Python的元编程特性来控制类的行为。

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class MyClass(metaclass=Singleton):
    pass

my_instance = MyClass()


方法五:使用线程局部存储(Thread Local Storage)
如果需要在多线程环境中使用单例,可以考虑使用 threading.local 来保证线程安全。


import threading

class Singleton(object):
    _instance_lock = threading.Lock()
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            with cls._instance_lock:
                if not cls._instance:
                    cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

singleton_instance = Singleton()

在多线程环境中如何保证单例模式的安全性?

在多线程环境中,为了防止多个线程同时进入 if instance is None 判断条件的情况,可以使用锁机制(如 threading.Lock() 或 threading.RLock())来确保线程安全。

单例模式有哪些优缺点?

优点:
控制实例的产生,节省系统资源。
提供了一个全局访问点,方便获取对象实例。
缺点:
违背了单一职责原则,将类的实例化与业务逻辑混在一起。
增加了系统的复杂度,降低了程序的可测试性。
过度使用会导致系统难以理解和维护。

你能给出一个简单的单例模式实现的例子吗?

Python
深色版本
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

# 使用例子
s1 = Singleton()
s2 = Singleton()
assert s1 is s2

单例模式是否适用于所有情况?
不一定,单例模式的应用场景有限,通常用于那些需要频繁访问且创建成本较高的对象。在现代软件开发中,依赖注入和 IoC 容器等技术逐渐成为更好的替代方案。

标签:__,面试题,Singleton,模式,instance,单例,._,cls
From: https://blog.csdn.net/qq_42792477/article/details/142894111

相关文章

  • 设计模式-责任连
    packagecom.example.cor.chain;importcom.example.cor.filter.Filter;importjavax.servlet.Servlet;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjava.io.IOException;publicclas......
  • 设计模式分类和软件设计原则
    1.设计模式分类类别名称描述设计模式创建型模式怎样创建对象,将对象的创建与使用分离单例、原型、工厂方法、抽象工厂、建造者结构型模式将类或对象按某种布局组成更大的结构代理、适配器、桥接、装饰、外观、亨元、组合行为型模式类或对象之间怎样相互协作......
  • 相机曝光的两种模式
    相机的曝光模式相机帧率和曝光时间的关系相机的图像采集包括曝光(Exposure)和读出(Readout)两部分曝光又分为非重叠(non-overlapped)曝光和重叠(overlapped)曝光两种在非重叠(“non-overlapped”)模式中,每个图像采集的周期中,相机在下一个图像采集开始前,均要完成曝光/......
  • AI 推理能力大“翻车”!苹果最新论文:LLM只是复杂的模式匹配,而不是真正的逻辑推理
    内容提要大语言模型真的可以推理吗?LLM都是“参数匹配大师”?苹果研究员质疑LLM推理能力,称其“不堪一击”!文章正文苹果的研究员MehrdadFarajtabar等人最近发表了一篇论文,对大型语言模型(LLM)的推理能力提出了尖锐的质疑,他认为,LLM的“推理”能力,其实只是复杂的模式匹......
  • 使用Entity Framework Core(EF Core)进行开发时,结合仓库模式和工作单元模式,服务层以及控
    仓储(Repository)仓储模式封装对数据源的访问逻辑,包括CRUD操作。以下是一个简单的仓储接口和实现示例:publicinterfaceIRepositorywhereT:class{Task<IEnumerable>GetAllAsync();TaskGetByIdAsync(intid);TaskAddAsync(Tentity);TaskUpdateAsync(Tentity);Tas......
  • 基于nodejs+vue基于O2O模式的外卖订餐系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,人们的生活方式正经历着深刻的变革。在快节奏的城市生活中,外卖订餐已成为众多消费者解决日常饮食需求的重要方式。传统的餐饮行业......
  • 高级java每日一道面试题-2024年10月13日-数据库篇[Redis篇]-怎么保证缓存和数据库数据
    如果有遗漏,评论区告诉我进行补充面试官:怎么保证缓存和数据库数据的一致性?我回答:在分布式系统中,保证缓存和数据库数据的一致性是一个常见的挑战。由于缓存的引入主要是为了提高系统的性能和响应速度,但这也带来了数据一致性的问题。以下是一些常用的方法来保证缓存和......
  • 高级java每日一道面试题-2024年10月11日-数据库篇[Redis篇]-Redis都有哪些使用场景?
    如果有遗漏,评论区告诉我进行补充面试官:Redis都有哪些使用场景?我回答:Redis是一个开源的、基于键值对的数据结构存储系统,,它支持多种数据类型,包括字符串、散列、列表、集合和有序集合。它可以用作数据库、缓存和消息中间件。由于其高性能、丰富的数据结构支持以及多种......
  • 2024java最新面试题-10张图!彻底搞定Java线程状态转换
    Java线程状态有几个?Java线程状态是如何转换?Java线程状态转换什么情况会进入锁的等待队列?Java线程状态转换什么情况会进入锁的同步队列?一提到Java线程状态,不少读者立马想到线程状态转换图,但细想,印象又不深刻,只记得有那么几个状态。再要你说出Java线程状态是如何转换的,脑子里......
  • 设计模式(二)
    第一类模式:创建者模式创建型模式的主要关注点是“怎么样创建对象?”,它的主要关注点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为:单例模式工厂方法模式抽象工程模式原型模式建造者......