首页 > 其他分享 >1.单例模式

1.单例模式

时间:2022-08-26 15:56:41浏览次数:50  
标签:__ name 模式 instance 实例 单例 cls

1.单例模式

单例,顾名思义是一个实例,即在一个项目之中,单例的类只实例化一次。它常常应用于数据库操作、日志函数。

在一个大型项目中使用到日志和数据库操作的地方很多,不能每个文件都去单独实例化一次,此时单例模式就显示出了他的价值。

单例的核心在类的内部方法 __new__(),每次实例化都是通过执行new函数来返回实例对象。

单例就是在类里面定义一个作用域最高的标志性的属性,如果实例化过一次,那这个属性为True,否则为False,那么返回上次实例化的对象。

意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

适用性

当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

核心代码

class Singleton(object):

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            org = super(Singleton, cls) # 让cls继承指定的父类 Singleton
            cls._instance = org.__new__(cls) # 创建实例
        return cls._instance # 返回具体的实例

# 复写内部方法__new__()
# 通过hasattr函数判断该类实例化时有没有_instance属性
# 如果不存在,那么继承并返回原始的__new__方法给_instance属性
# 如果存在则直接返回_instance属性所指的对象

示例代码

class Singleton(object):
    
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            org = super(Singleton, cls)
            cls._instance = org.__new__(cls)
        return cls._instance
 
class MyClass(Singleton):
    def __init__(self, name):
        self.name = name
 
if __name__ == "__main__":
    a = MyClass("A")
    print(a.name)
    b = MyClass("B")
    print(a.name)
    print(b.name)
    b.name = 'C'
    print(a.name)
    print(b.name)


输出结果:
A
B
B
C
C

单例模式的优点和应用

单例模式的优点:
1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间;
2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用;
3、单例可长驻内存,减少系统开销。
单例模式的应用举例:
1、生成全局惟一的序列号;
2、访问全局复用的惟一资源,如磁盘、总线等;
3、单个对象占用的资源过多,如数据库等;
4、系统全局统一管理,如Windows下的Task Manager;
5、网站计数器。

单例模式的缺点

1、单例模式的扩展是比较困难的;
2、赋于了单例以太多的职责,某种程度上违反单一职责原则(六大原则后面会讲到);
3、单例模式是并发协作软件模块中需要最先完成的,因而其不利于测试;
4、单例模式在某种情况下会导致“资源瓶颈”。

标签:__,name,模式,instance,实例,单例,cls
From: https://www.cnblogs.com/amgulen/p/16627786.html

相关文章

  • 设计模式之工厂模式
    packagecn.com.pep.model.simpleFactory;/***@Title:CheesePizza*@Description:*@authorwwh*@date2022-8-2214:22:53*/publicclassCheesePiz......
  • 生产者、消费者模式
    是什么生产者消费者模式(生产者消费者模式)是经典的线程同步案例,也称为有限缓冲问题。生产者产生数据,但是数据不能超出缓冲区的限制,当缓冲区满时,停止生产。消费者消费生产......
  • 第一章 模式识别的相关概念学习笔记
    1  相关概念1.1 什么是模式?可以被区分是否相似,存在于时间和空间中可观察的物体之中的信息。(模式不是事务本体,是从事物中获取的信息)1.2 模式的直观特性可观察性......
  • 【Account Kit】使用Authorization Code模式接入华为帐号,返回accessToken为空
    问题描述:使用AuthorizationCode模式接入华为帐号,返回AuthAccount的accessToken为空,并且没有返回uid解决方案:一般在静默登录的时候,需要在初始化HuaweiIdAuthParams对象......
  • 初识设计模式 - 单例模式
    简介一个类只允许创建一个对象(或实例),那么这个类就是一个单例类,这种设计模式称作单例设计模式(SingletonDesignPattern),简称单例模式。单例模式保证系统内存中只存在一个......
  • 01 Redis 三种搭建模式:主从模式-哨兵模式-高可用集群模式
    一、主从模式用域名指定主节点,当主节点宕机,改域名指向从节点缺点不知道什么时候挂掉,丢失数据,需要人工介入,运维24h待命 二、哨兵模式比主从模式,主要多了个哨兵,能自动......
  • Android学习笔记五(JAVA):创建新的Activity,启动新的Activity,管理任务之定义启动模式,从
    本篇笔记给QuizDemo新增一个HelpActivity,用户点击Help按钮,会跳转到HelpActivity屏幕,并选择是否查看答案。查看答案之后,返回到答题屏幕,但是如果已经看了答案,这一题的作答就......
  • 了解单例模式
    单例模式单例模式是什么?单例设计模式(SingletonDesignPattern)如果一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模......
  • python selenium使用无头模式执行用例
    什么是无头模式?HeadlessBrowser模式是浏览器的无界面状态,即在不打开浏览器界面的情况下使用浏览器。该模式的好处如下:1)可以加快web自动化测试的执行时间,对于web自动化......
  • Unity-单例模板
    普通单例模板publicabstractclassSingleton<T>whereT:new(){privatestaticTinstance;publicstaticTInstance{get{if(i......