Python 设计模式创建型单例模式

目录
  • 一、单例模式
  • 二、应用场景
  • 三、编码示例
    • 1.单线程中的单例模式
      • 方式一、重载类构造器
      • 方式二、实现单例装饰器
    • 2.多线程中的单例模式
      • 方式三、重载具有线程锁的类构造器

一、单例模式

单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象。

二、应用场景

整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如:

  1. 系统的配置信息对象
  2. 日志对象
  3. 数据库操作对象
  4. 线程池对象

三、编码示例

1.单线程中的单例模式

方式一、重载类构造器

定义:

class Singleton(object):

    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance

使用:

if __name__ == '__main__':
    instance1 = Singleton()
    instance2 = Singleton()
    instance3 = Singleton()

    # 打印出 3 个实例对象的内存地址,判断是否相同。
    print(id(instance1))
    print(id(instance2))
    print(id(instance3))

方式二、实现单例装饰器

定义:

def singleton(cls):

    _instance = {}

    def _singleton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]

    return _singleton

使用:

@singleton
class Singleton(object):
    """单例实例"""

    def __init__(self, arg1):
        self.arg1 = arg1

if __name__ == '__main__':
    instance1 = Singleton("xag")
    instance2 = Singleton("xingag")

    print(id(instance1))
    print(id(instance2))

2.多线程中的单例模式

方式三、重载具有线程锁的类构造器

多线程中的单例模式,需要在__new__ 构造器中使用threading.Lock() 同步锁。

定义:

class Singleton(object):

    _instance = None
    _instance_lock = threading.Lock()

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            with cls._instance_lock:
                cls._instance = object.__new__(cls, *args, **kwargs)
        return cls._instance

使用:

def task(arg):
    instance = Singleton()
    print(id(instance), '\n')

if __name__ == '__main__':
    for i in range(3):
        t = threading.Thread(target=task, args=[i, ])
        t.start()

到此这篇关于Python 设计模式创建型单例模式的文章就介绍到这了,更多相关Python 单例模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python设计模式结构型代理模式

    目录 一.代理模式 二.应用场景 三.代码示例 一.代理模式 代理模式,为其他对象提供一种代理,以此控制一个对象的访问方式.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二.应用场景 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的地址空间可以是在本机器中,也可是在另一台机器中.远程代理又叫做大使(Ambassador).好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在. 虚拟

  • Python设计模式中的备忘录模式

    目录 备忘录模式 应用场景 代码示例 总结 备忘录模式 备忘录模式,在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单来说,就是在运行过程中我们可以记录某个状态,当遇到错误时恢复当前状态,这在业务流程中是用设计来处理异常情况. 优点: 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取.这时,使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界.

  • Python设计模式之备忘录模式原理与用法详解

    本文实例讲述了Python设计模式之备忘录模式原理与用法.分享给大家供大家参考,具体如下: 备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' """ 大话设计模式 设计模式--备忘录模式 备忘录模式(Me

  • Python设计模式中的状态模式你了解吗

    目录 状态模式 应用场景 代码示例 总结 状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程. 优点: 封装了状态转换规则. 枚举了可能的状态,在枚举状态之前需要确定状态的种类. 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为. 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块. 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数. 缺点: 状态模式的使用必然会增加系统类和对象的个数.

  • Python设计模式编程中的备忘录模式与对象池模式示例

    Memento备忘录模式 备忘录模式一个最好想象的例子:undo! 它对对象的一个状态进行了'快照', 在你需要的时候恢复原貌.做前端会有一个场景:你设计一个表单,当点击提交会对表单内容 验证,这个时候你就要对用户填写的数据复制下来,当用户填写的不正确或者格式不对等问题, 就可以使用快照数据恢复用户已经填好的,而不是让用户重新来一遍,不是嘛? python的例子 这里实现了一个事务提交的例子 import copy def Memento(obj, deep=False): # 对你要做快照的对

  • Python 设计模式创建型单例模式

    目录 一.单例模式 二.应用场景 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 方式二.实现单例装饰器 2.多线程中的单例模式 方式三.重载具有线程锁的类构造器 一.单例模式 单例模式,实现一个类,并且保证这个类的多次实例化操作,都会只生成同一个实例对象. 二.应用场景 整个系统中只需要存在一个实例对象,其他对象都可以通过访问该对象来获取信息,比如: 系统的配置信息对象 日志对象 数据库操作对象 线程池对象 三.编码示例 1.单线程中的单例模式 方式一.重载类构造器 定义: cla

  • Python设计模式创建型原型模式

    目录 一.原型模式 二.应用场景 三.代码示例 一.原型模式 原型是相对于复制.克隆而言的,但是不同于模板,模板创造出的东西是一模一样,而原型创造出的东西是允许存在差异化和个性化的. 原型模式的实现思路是:“深拷贝” 和 “属性更新”.定义一个原型,设计一个拷贝接口,不需要频繁实例化类,只需要拷贝. 优点: 减少因为对象实例化而产生的损耗,并实行动态装载. 二.应用场景 三.代码示例 要实现多个人的自我介绍,一般方法是每个人都创建一个对象,但是使用原型模式之后,只需要实例化一个对象(标准人),后

  • Python设计模式行为型观察者模式

    目录 一.观察者模式 二.应用场景 三.代码示例 一.观察者模式 观察者模式,必须包含 “观察者” 和 “被观察者” 这两个角色,并且观察者和被观察者之间存在 “观察” 的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应.例如:业务数据是被观察者,用户界面是观察者. 实际上,观察者模式大部分都是一对多的关系,可以多个观察者对象同时观察某一个被观察对象. 观察者模式的实现思路是:核心的抽象类用于管理所有依赖它的其他类,当核心类发生变动时,主动通知并更新其他类. 二

  • Python 设计模式行为型访问者模式

    目录 一.访问者模式(Visitor Pattern) 二.应用场景 三.代码示例 一.访问者模式(Visitor Pattern) 数据结构中保存着许多元素,当我们希望改变一种对元素的处理方式时,要避免重复的修改数据结构.那么就要求我们在实现代码时,将数据的处理进行分离,即:数据类只提供一个数据处理的接口,而该数据处理接口就被称之为访问者.那么,相同结构的数据面临不同的处理结果时,我们只需要创建不同的访问者. 访问者模式,指作用于一个对象结构体上的元素的操作.访问者可以使用户在不改变该结构体中

  • Python设计模式行为型责任链模式

    目录 一.责任链模式 二.应用场景 三.代码示例 一.责任链模式 责任链模式,将多个处理方法连接成一条链条,请求将在这条链条上流动直到该链条中有一个节点可以处理该请求.通常这条链条是一个对象包含对另一个对象的引用而形成链条,每个节点有对请求的条件,当不满足条件将传递给下一个节点处理. 责任链模式有几个要点: 一个对象中含有另一个对象的引用以此类推形成链条. 每个对象中应该有明确的责任划分,即处理请求的条件. 链条的最后一节应该设计成通用请求处理,以免出现漏洞. 请求应该传入链条的头部 二.应用场

  • Python 设计模式行为型解释器模式

    目录 一.解释器模式 二.应用场景 三.代码示例 一.解释器模式 解释器模式,开发者自定义一种 “有内涵” 的语言(或者叫字符串),并设定相关的解释规则,输入该字符串后可以输出公认的解释,或者执行程序可以理解的动作. 优点: 可扩展性比较好,灵活. 增加了新的解释表达式的方式. 易于实现简单文法. 缺点: 可利用场景比较少. 对于复杂的文法比较难维护. 解释器模式会引起类膨胀. 二.应用场景 SQL 解析 符号处理引擎 三.代码示例 实体角色: 终结符表达式:实现与文法中的元素相关联的解释操作,

  • Python设计模式中的创建型工厂模式

    目录 一.工厂模式(Factory Pattern) 二.应用场景 三.编码示例 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 一.工厂模式(Factory Pattern) 工厂模式(Factory Pattern),提供了一种实例化(创建)对象的最佳方式. 在工厂模式中,首先定义了一个抽象的工厂类(class Factory),并且在该工厂类中定义了提供了一个通用的.用于实例化对象的 Interface(接口)函数.然后当 Client 想要实例化某个具体的类的对象时,只需要将需求告

  • java编程创建型设计模式单例模式的七种示例

    目录 1.什么是单例模式? 2.七种写法 2.1饿汉式(静态常量) 2.2饿汉式(静态代码块) 2.3懒汉式(线程不安全) 2.4懒汉式(线程安全,同步方法) 2.5双重校验锁 2.6静态内部类 2.7枚举 3.单例模式在JDK中的应用(简单的源码分析) 4.单例模式总结 1.什么是单例模式? 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). 比如Hibernate的 SessionFactory,

  • Python 设计模式中的创建型建造者模式

    目录 一.建造者模式 二.代码示例 一.建造者模式 建造者模式,顾名思义类似于建筑工人,他们按照有条理的施工顺序(e.g. 打桩 => 浇筑框架 => 砌墙 => 装修)来进行建筑的修建.对于千差万别的建筑,都可以复用同样的施工流程.因为不同的材料.不同设计,可以有不同的表现. 建造者模式,与抽象工厂模式同样用于实例化复杂的对象,主要区别在于: 抽象工厂模式侧重于实例化多个系列的复杂对象. 建造者模式侧重于一步步有序地构造一个复杂对象. 二.代码示例 按照有序的步骤来组装(建造)一个复杂

  • PHP设计模式(四)原型模式Prototype实例详解【创建型】

    本文实例讲述了PHP设计模式:原型模式Prototype.分享给大家供大家参考,具体如下: 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递 下面是一个邮寄快递的场景: "给我寄个快递."顾客说. &qu

随机推荐