笔记-程序设计-单例模式

笔记-程序设计-单例模式

 

 

1.      单例模式

单例模式(singleton pattern)是一种常用软件设计模式,该模式主要目的是确保某一个类只有一个实例存在。

下面几种方法的原理都是类似的,就是在导入/创建时判断是否唯一。

 

2.      python实现单例模式

2.1.    模块方式

模块只会在第一次导入时加载,就是单例模式。

因此,只需要把相关函数和数据定义在一个模块中,就可以获得一个单例类。

# singleton module

class Singleton(object):

    def foo(self):

        pass

singleton = Singleton()

将上面的代码保存到mysingleton.py中,要使用时,直接导入这个对象。

from mysingleton import singleton

 

2.2.    使用装饰器

使用装饰器修饰类,在装饰器函数中维护一个字典对象,该字典缓存了所有单例类,在实例化类时装饰器进行判断,如果该类已存在则S

# decoration singleton

 

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 A(object):

    a = 1

 

    def __init__(self, x=0):

        self.x = x

 

a1 = A(2)

a2 = A(3)

 

print('a1.a=%d, a1.x=%d; a2.a=%d, a2.x=%d'%(a1.a, a1.x, a2.a, a2.x))

 

2.3.    使用__new__()

 

# singleton __new__()

class Singleton(object):

    _instance = None

 

    def __new__(cls, *args, **kwargs):

        if not cls._instance:

            cls._instance = super(Singleton, cls).__new__(cls)

        return cls._instance

 

class Myclass(Singleton):

    a = 1

 

a1 = Myclass()

a2 = Myclass()

print(a1 == a2, a1 is a2)

很奇怪很多博客文档中使用cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs),

但在3.6.4实测时会报错TypeError: object() takes no parameters,去掉参数后正常。

 

2.4.    使用元类

# singleton metaclass

class Singleton(type):

    print('www')

    def __call__(cls, *args, **kwargs):

        if not hasattr(cls, '_instance'):

            print(cls)

            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)

        return cls._instance

 

class MyClass(metaclass=Singleton):

    a = 4

 

 

a1 = MyClass()

a2 = MyClass()

print(a1 == a2) #True

posted @ 2018-10-15 22:53  木林森__𣛧  阅读(121)  评论(0)    收藏  举报