首页 > 编程语言 >Python实现软件设计模式6:单例模式 Singleton Pattern

Python实现软件设计模式6:单例模式 Singleton Pattern

时间:2023-12-20 13:13:29浏览次数:35  
标签:__ Singleton name Python 模式 instance 单例 print cls

动机

  • 针对某个类,为了保证系统中只创建一个示例,并且易于被访问(例如操作系统的任务管理器,软件的登陆注册界面)
  • 自行创建这个实例,无法从外部创建这个实例,向系统提供这个实例

饿汉式单例 Java版本

在类加载的时候,就创建对象,如果后续得不到使用,可能会造成内存资源浪费

懒汉式单例 Java版本

只有第一次使用getInstance静态方法时,才会创建唯一的对象,不会导致系统资源浪费;但在多线程执行环境下,可能生成多个示例对象而不唯一。

懒汉式单例 与 双重检查锁定 Java版本

volatile关键字让Java虚拟机不要可以优化instance相关的代码。

单例模式小结

  • 饿汉式单例:无需考虑多个线程同时访问的问题,调用速度和反应时间优于懒汉式单例,资源利用效率不及懒汉式单例,系统加载时间可能会比较长;

  • 懒汉式单例:实现了延迟加载,但是 必须处理好多个线程同时访问的问题;需要通过双重检查锁定等机制进行控制,将导致系统性能受到一定影响;

内部静态类单例模式 Java版本

Python版本代码

class Logger(object):
    __instance = None

    def __init__(self):
        raise RuntimeError('Call instance() instead')

    @classmethod
    def instance(cls):
        if cls.__instance is None:
            print('Creating new instance')
            cls.__instance = super(Logger, cls).__new__(cls)   # cls.__new__(cls)
        return cls.__instance
    
# log = Logger()  # 报错
log1 = Logger.instance()
print(log1)

log2 = Logger.instance()
print(log1 is log2)

def singleton(cls):
    instances = {}
    def getinstance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)   # 仅初始化1次生成一个唯一的对象
        return instances[cls]
    return getinstance
 
@singleton
class Country:
    def __init__(self, name, area):
        self.name = name 
        self.area = area
        print(f"Country name: {self.name}, land area: {self.area} km^2.")

 
a = Country('China', 965)
b = Country('Japan', 75)

print(a == b)   # True,因为 a 和 b 引用的是同一个实例

print(a.name, a.area)
print(b.name, b.area)

标签:__,Singleton,name,Python,模式,instance,单例,print,cls
From: https://www.cnblogs.com/Higgerw/p/17916282.html

相关文章

  • 《Python网络爬虫:从入门到实战》
    ......
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩
    ......
  • Python实现软件设计模式5:原型模式 Prototype Pattern
    动机对象的克隆问题,想要复制出本对象的一个副本,属性方法一模一样从需求上来说,先快速克隆对象,后续根据需求再进行对象局部属性的修改区分为深克隆和浅克隆两个版本,默认为浅克隆角色Prototype抽象原型类ConcretePrototype具体原型类Client客户类浅克隆与深克隆......
  • 基于SaaS模式的云HIS信息管理系统源码
    云HIS全称为基于云计算的医疗卫生信息系统,是运用云计算大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递处理的业务和技术亚台云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全......
  • 适配器模式
    在你成功拿到五心之钢后,为了能够好好玩这把天选局,偷摸溜了出去,进到厕所,发现商店中静静躺着一张伊泽瑞尔,而后又在接下来的选秀中拿到铲子和腰带,你激动的合成了心之钢转,在你放上伊泽瑞尔后,发现你现在没有凯隐,因此你将一张布里茨放了上去,给它一张心之钢转,当当当!七心之钢!心之钢转就是......
  • 如何将 Python 项目打包成 exe,另带卸载功能!
    前言虽然我是做web的,但是对Python的众多开源项目一直都很关注。像之前的stablediffusion的AI绘画,和so-vits-svc音色替换等源码的部署文档都很完善了。尽管如此,对于刚入门的和本地环境搭建各种踩坑的同学,又急于一试就显得不太友好了。针对这一现象,网上早有了各种大佬做......
  • 设计模式—模板模式
    介绍代码游戏模板类定义一个游戏模板虚类Game,抽象并规范好游戏的进行流程publicabstractclassGame{abstractvoidinit();abstractvoidstartPlay();abstractvoidendPlay();//模板publicfinalvoidplay(){//初始化......
  • 手把手教你用python做一个年会抽奖系统
    引言马上就要举行年会抽奖了,我们都不知道是否有人能够中奖。我觉得无聊的时候可以尝试自己写一个抽奖系统,主要是为了娱乐。现在人工智能这么方便,写一个简单的代码不是一件困难的事情。今天我想和大家一起构建一个简易的抽奖系统,这样也能够巩固一下我自己对Python语法和框架的理解......
  • 设计模式—策略模式
    介绍在策略模式(StrategyPattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代......
  • python xattr库
    因:ceph有一条设置文件/目录配额的命令ceph.quota.max_bytes,想在Python代码中调用它,最直接的方法是使用popen/subprocess等库直接执行这条命令,但如果频繁调用担心会影响系统性能,查阅资料发现xattr库也可以实现且更加方便。开始吧首先需要安装xattr库pip3installxattr......