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

2020-02-02  本文已影响0人  远行_2a22

Singleton

动机(Motivation)

模式定义

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

要点总结

例子

方法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方法实现的单例模式

知识点:

# -*- 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实现

上一篇 下一篇

猜你喜欢

热点阅读