返回顶部
首页 > 资讯 > 后端开发 > Python >Python设计模式——单例模式
  • 415
分享到

Python设计模式——单例模式

模式Python 2023-01-31 03:01:46 415人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

一、单例模式理论单例模式:    保证某一个类只有一个实例,而且在全局只有一个访问点优点:    1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间    2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用

一、单例模式理论

单例模式:
   保证某一个类只有一个实例,而且在全局只有一个访问点
优点:
   1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间
   2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用
   3、单例可长驻内存,减少系统开销

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

应用场景:
   1、生成全局唯一的变量,比如序列号
   2、访问全局复用的唯一资源,如磁盘,总线等
   3、单个对象占用的资源太多,如数据库
   4、系统全局统一管理,如windows下的任务管理器

二、对__new__的分析

# class Demo:
#     def __init__(self, name):
#         self.name = name
#
#     def show_name(self):
#         print("Name is: {}".fORMat(self.name))
#
# if __name__ == '__main__':
#
#     d = Demo("toby")
#     d.show_name()

'''
引用大神的描述:
    这样便是__init__最普通的用法了。但__init__其实不是实例化一个类的时候第一个被调用的方法。
    当使用Demo("toby")这样的表达式来实例化一个类时,最先被调用的方法其实是 __new__ 方法。
    __new__ 方法是什么?
    __new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而__new__方法正是创建这个类实例的方法。
'''

class Demo:
    def __new__(cls, name):
        print("Call __new__")
        class_instance = super(Demo, cls).__new__(cls)
        print("new创建了类实例:", class_instance) #打印一下
        return class_instance #返回Demon类的一个实例给__init__,然后利用这个实例来调用类的__init__方法

    def __init__(self, name): #那__init__用什么来接收__new__返回来的类实例呢?答案就是self
        print("init接收到new返回回来的类实例:", self) #打印一下这个self,也就是看一下由__new__产生的实例
        print("Call __init__")
        self.name = name

    def show_name(self):
        print("Name is: {}".format(self.name))
#
# if __name__ == '__main__':
#     d = Demo("toby")
#     d.show_name()

'''
引用大神的总结:
    所以,__init__ 和 __new__ 最主要的区别在于:
    1、__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 
    做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
    2、__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法。
    但是说了这么多,__new__最通常的用法是什么呢,我们什么时候需要__new__?,单例模式就是一个很好的例子
'''

三、单例模式(案例1)

#coding:utf-8
import threading
import time

#这里使用方法__new__来实现单例模式
class Singleton(object): #抽象单例
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kwargs)
        return cls._instance

#总线
class Bus(Singleton):
    lock = threading.RLock()
    def sendData(self, data):
        self.lock.acquire()
        time.sleep(3)
        print("Sending Signal Data...", data)
        self.lock.release()

#线程对象,为更加说明单例的含义,这里讲Bus对象实例化在了run里
class VisitEntity(threading.Thread):
    my_bus = ""
    name = ""
    def getName(self):
        return self.name
    def setName(self, name):
        self.name = name
    def run(self):
        self.my_bus = Bus()
        self.my_bus.sendData(self.name)
if __name__ == '__main__':
    for i in range(3):
        print("Entity {} begin to run...".format(i))
        v = VisitEntity()
        v.setName("Toby"+str(i))
        v.start()

四、单例模式(案例2)

#使用__new__类方法来保证只有一个实例被创建出来
class OneOnly(object):
    _singleton = None
    def __new__(cls, *args, **kwargs):
        if not cls._singleton: #判断是否创建有实例,如果没有则调用super()函数来创建它
            cls._singleton = super(OneOnly, cls).__new__(cls) #构造方法__new__被调用时,会构造该类的一个新实例
        return cls._singleton

#定义一个普通的类,仅有初始化方法__init__
class Test:
    def __init__(self, name):
        self.name = name

#定义一个Demo类,并继承实现单例模式的OneOnly类
class Demo(OneOnly):
    def __init__(self, name):
        self.name = name

    def chage_name(self, new_name):
        self.name = new_name

    def show_name(self):
        print("Name is: {}".format(self.name))

if __name__ == '__main__':

    #当通过OneOnly类中的构造方法构造实例时,总是会的得到完全相同的实例,内存地址也相同
    # o1 = OneOnly()
    # o2 = OneOnly()
    # print(o1)
    # print(o2)

    #通过Test类创建出来的两个实例t1和t2,是两个不同的实例,内存地址也是不同的
    # t1 = Test("toby")
    # t2 = Test("ttr")
    # print(t1)
    # print(t2)

    #Demo类继承了实现了单例模式的OneOnly类,因此,通过Demo类实例化出来的对象都是同一个对象
    d1 = Demo("toby")
    d2 = Demo("ttr")
    d3 = Demo("laowang")
    # 通过打印可知,他们的内存地址都是一样的
    # print(d1)
    # print(d2)

    #发现打印出来的name都是"laowang",似乎最后创建的一个实例把前两个的给覆盖了
    d1.show_name()
    d2.show_name()
    d3.show_name()

    #通过实例d1修改名字后,再通过实例d3和d2来查看,果然也一起改变了。由此证明他们确实是同一个实例
    d1.chage_name("juck")
    d3.show_name()
    d2.show_name()


--结束END--

本文标题: Python设计模式——单例模式

本文链接: https://lsjlt.com/news/187369.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【python 设计模式】单例模式
    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的配置信息存放在一个文件中...
    99+
    2023-01-31
    模式 python
  • Python设计模式——单例模式
    一、单例模式理论单例模式:    保证某一个类只有一个实例,而且在全局只有一个访问点优点:    1、由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间    2、全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用...
    99+
    2023-01-31
    模式 Python
  • python设计模式之单例模式
    单例模式是一种创建型设计模式,它确保一个类有且只有一个特定类型的对象,并提供全局访问点。其意图为: 确保类有且只有一个对象被创建 为对象提供一个访问点,使程序可以全局访问该对象 控制共享资源的并行访问 简单理解:单例...
    99+
    2023-01-30
    模式 python
  • Java设计模式-单例模式
    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供...
    99+
    2023-06-05
  • Python 设计模式创建型单例模式
    目录一、单例模式二、应用场景三、编码示例1.单线程中的单例模式方式一、重载类构造器方式二、实现单例装饰器2.多线程中的单例模式方式三、重载具有线程锁的类构造器一、单例模式 单例模式,...
    99+
    2024-04-02
  • Android设计模式之单例模式
      1、单例模式常见情景   设计模式中,简单不过的是单例模式。先看看单例模式   Singleton模式可以是很简单的,它的全部只需要一个类可以完成(看看这章可怜的U...
    99+
    2022-06-06
    单例模式 Android
  • Java设计模式之单例模式
    目录什么是设计模式?单例模式是什么?单例模式设计的原则是什么?Java实现单例模式的5种方式?懒汉饿汉静态内部类双重校验锁DCL(Double Check Lock)枚举(num)总...
    99+
    2024-04-02
  • C#设计模式之单例模式
    单例模式也是创建型模式的一种,也是23种设计模式中比较简单的一种。见名思意,在整个软件系统中,只有某个类型的一个对象,并且访问他的地方也只有一个,也就是只有一个全局对象访问点,这个实...
    99+
    2024-04-02
  • JavaScript设计模式之单例模式
    目录单例模式实现单例模式透明的单例模式用代理实现单例模式惰性单例通用的惰性单例小结单例模式 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的 ...
    99+
    2022-11-13
    JavaScript设计模式 JavaScript单例模式
  • Android设计模式之单例模式实例
    目录一、概念1.1 单例类1.2 优缺点1.2.1 优点1.2.2 缺点二、创建单例模式的方法2.1 饿汉式2.2 懒汉式2.2.1 懒汉式(非线程安全)2.2.2 懒汉式(线程安全...
    99+
    2023-05-16
    Android单例模式 Android设计模式单例模式
  • JavaScript中的设计模式 单例模式
    目录1、什么是设计模式2、设计模式五大设计原则(SOLID)3、为什么需要设计模式?4、单例模式前言: 设计模式在我们编程中是十分重要的! 设计模式(Design pattern)...
    99+
    2024-04-02
  • .Net设计模式之单例模式(Singleton)
    一、动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种...
    99+
    2024-04-02
  • 【Java】设计模式之单例模式与工厂模式
    ✅作者简介:热爱后端语言的大学生,CSDN内容合伙人 ✨精品专栏:C++面向对象 🔥系列专栏:JavaSE精品总结 文章目录   前言1、设计模式概念及分类2、单例模式2...
    99+
    2023-10-04
    java 单例模式 设计模式
  • Android设计模式系列之单例模式
     单例模式,可以说是GOF的23种设计模式中最简单的一个。 这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),...
    99+
    2022-06-06
    单例模式 Android
  • Java设计模式之单例模式简介
    目录一、饿汉式(静态常量)二、饿汉式(静态代码块)三、懒汉式(线程不安全)四、懒汉式(线程安全,同步方法)五、懒汉式(线程不安全,同步代码块)六、双重检查( DCL )七、静态内部类...
    99+
    2024-04-02
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2024-04-02
  • C++设计模式之单例模式详解
    目录单例模式:就是只有一个实例。单例模式又分为两种基本的情形:饿汉式和懒汉式如下是懒汉式单例类小结:继续看单例模式总结单例模式:就是只有一个实例。 singleton pattern...
    99+
    2024-04-02
  • Android设计模式之单例模式解析
    在日常开发过程中时常需要用到设计模式,但是设计模式有23种,如何将这些设计模式了然于胸并且能在实际开发过程中应用得得心应手呢?和我一起跟着《Android源码设计模式解析与实战》一书边学边应用吧!今天我们要讲的是单例模式定义确保某一个类只有...
    99+
    2023-05-30
    android 单例模式 之单
  • Android设计模式之单例模式详解
    单例模式一个类只有一个实例,并且可以全局访问使用应用场景如账户管理类,数据库操作类等(某个对象频繁被访问使用)常用方式饿汉式懒汉式同步加锁DCL双重加锁验证静态内部类枚举单例饿汉式加载类的同时立即进行初始化操作,对资源消耗很大public ...
    99+
    2023-05-30
    android 设计模式 单例模式
  • java设计模式之单例模式解析
    单例模式是最简单但同时也是很重要的一种设计模式,优点有以下几个方面:当内存占用特别大的类需要频繁地创建销毁时,单例模式可以节省内存和提高性能,例如myBatis里面的sessionFactory当需要对文件做单一读写时,例如同一时间只能同时...
    99+
    2023-05-31
    java 设计模式 单例模式
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作