美文网首页
设计模式(python实现)--单例模式(Singleton)

设计模式(python实现)--单例模式(Singleton)

作者: 远行_2a22 | 来源:发表于2020-02-02 16:37 被阅读0次

Singleton

动机(Motivation)

  • 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。
  • 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
  • 这应该是类设计者的责任,而不是使用者的责任。

模式定义

保证一个类仅有一个实例,并提供一个该实例的全局访问点。
——《设计模式》GoF

要点总结

  • Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  • Singleton模式一般不要支持拷贝构造函数和Clone接口,因为这有可能导致多个对象实例,与Singleton模式的初中违背。
  • 如何实现多线程环境下安全的Singleton?注意对双检查锁的正确实现。

例子

方法1 使用模块

其实,python的模块就是天然的单例模式,因为模块在第一次导入的时候,会生成.pyc文件,当第二次导入的时候,就会直接加载.pyc文件,而不是再次执行模块代码.如果我们把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了.
新建一个python模块叫singleton,然后创建以下python文件mysingleton.py

class _Singleton(object):
    def foo(self):
        pass
Singleton = _Singleton()

在另一个py文件中使用:

from singleton.mysingleton import Singleton

方法2 基于new方法实现的单例模式

知识点:

  • 一个对象的实例化过程是先执行类的new方法,如果我们没有写,默认会调用object的new方法,返回一个实例化对象,然后再调用init方法,对这个对象进行初始化,我们可以根据这个实现单例.
  • 在一个类的new方法中先判断是不是存在实例,如果存在实例,就直接返回,如果不存在实例就创建.
# -*- coding:utf-8 -*-
import threading


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

    def __init__(self):
        pass

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


def task(arg):
    obj = Singleton()
    print(obj)


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

输出

<__main__.Singleton object at 0x108a42710>
<__main__.Singleton object at 0x108a42710>
<__main__.Singleton object at 0x108a42710>
<__main__.Singleton object at 0x108a42710><__main__.Singleton object at 0x108a42710>

<__main__.Singleton object at 0x108a42710><__main__.Singleton object at 0x108a42710>

<__main__.Singleton object at 0x108a42710>
<__main__.Singleton object at 0x108a42710>
<__main__.Singleton object at 0x108a42710>

参考单例模式以及Python实现

相关文章

  • python之理解单例模式

    python之理解单例模式 1、单例模式 单例模式(Singleton Pattern)是一种常见的软件设计模式,...

  • Python单例模式(Singleton)的N种实现

    Python单例模式(Singleton)的N种实现

  • 2018-06-19 Python中的单例模式的几种实现方式的及

    转载自: Python中的单例模式的几种实现方式的及优化 单例模式 单例模式(Singleton Pattern)...

  • go设计模式代码实现

    go 设计模式代码实现 单例模式 代码实现 type singleton struct{} var ins *si...

  • 技术总结

    设计模式:1.单例模式最简单的单例,应用场景(spring bean默认实现singleton模式,其他模式是cl...

  • JAVA设计模式 - 单例模式

    JAVA设计模式 - 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一...

  • 基础-单例模式

    单例模式总结-Python实现 面试里每次问设计模式,必问单例模式 来自《Python设计模式》(第2版) 1.理...

  • 单例模式

    3、单例模式(Singleton) 单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象...

  • python 单例模式

    单例模式 Singleton 网上搜索python 单例模式,实现方式大致有一下几种方式: 以模块导入的方式 使用...

  • 设计模式——单例模式

    设计模式——单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,这种类型...

网友评论

      本文标题:设计模式(python实现)--单例模式(Singleton)

      本文链接:https://www.haomeiwen.com/subject/ztyqxhtx.html