Python 设计模式 -- 单例模式

Python 单例模式

单例模式的意思是在同一个运行环境中一个进程里面,这个类的实例只有一份,该实例也只会初始化一次。
python 语言的单例模式至少可以有4种实现方式:

1.使用__new__ 构造函数:

class Singleton(object):
    __instance = None
    def __new__(cls, *argv, **kwags):
        if Singleton.__instance is None:
            Singleton.__instance = object.__new__(cls, *argv, **kwags)
        return Singleton.__instance

class MyFoo(Singleton):
    pass

f1 = MyFoo()
f2 = MyFoo()
print f1
print f2

>><__main__.MyFoo object at 0x7fd9f2a96110>
<__main__.MyFoo object at 0x7fd9f2a96110>

2.使用python装饰器实现:

def singleton(cls):
    __instance = {}
    def _singleton(*argv, **kwags):
        if cls not in __instance:
            __instance[cls] = cls(*argc, **kwags)
        return __instance[cls]
    return _singleton

@singleton
class MyFoo(object):
    def __init__(self, age):
        self.age = age

f1 = MyFoo(12)
f2 = MyFoo(13)
print f1
print f2
print f1.age
print f2.age

>><__main__.MyFoo object at 0x7fab563f4150>
<__main__.MyFoo object at 0x7fab563f4150>
12
12

3.使用import的方式:

#mySingleClass.py
class MySingleClass(object):
    def __init__(self):
        pass

single_instance = MySingleClass()

#test.py
def func1():
    from mySingleClass import single_instance
    print(single_instance)
def func2():
    from mySingleClass import single_instance
    print(single_instance)

func1()
func2()

>>0x7f13fa14e210>
0x7f13fa14e210>

4.共享属性:

创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.
这种方式和前面3种方式并不能相提并论,我觉得它根本没有实现正真意义上的单例,因为它实例化的时候创建的是id不同的实例,虽然指向了相同的__dict__。不推荐这种方式,有误导性。

class Singleton(object):
    __global_dict = {}
    def __new__(cls, *args, **kwags):
        __instance = object.__new__(cls, *args, **kwags)
        __instance.__dict__ = Singleton.__global_dict
        return __instance

class MyFoo(Singleton):
    def __init__(self, name):
        self.name = name

f1 = MyFoo("Python")
f2 = MyFoo("Java")
print(f1)
print(f2)
print f1.name
print f2.name

>><__main__.MyFoo object at 0x7fdc1315c350>
<__main__.MyFoo object at 0x7fdc1315c390>
Java
Java

你可能感兴趣的:(Python)