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

向右看齐 2022-10-25 14:11 361阅读 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()

输出

发表评论

表情:
评论列表 (有 0 条评论,361人围观)

还没有评论,来说两句吧...

相关阅读