单例模式

1.基于文件

 

(1)db.py

class Foo(object):

    def __init__(self):
        self.conn = "连接数据库"
        pass

    def get(self):
        self.conn
obj = Foo()

(2)views.py
print(db.obj)

(3)run.py
import db
import views

print(db.obj)    #只创建一次对象

 

2.基于@classmethod

示例:
import threading
import time
class Foo(object):
    instance=None
    lock=threading.Lock()    #线程保护,加锁
    def __init__(self):
        self.a1=1
        time.sleep(1)


    @classmethod
    def get_instance(cls,*args,**kwargs):
        if not cls.instance:
            with cls.lock:
                if not cls.instance:
                    obj=cls(*args,**kwargs)
                    cls.instance=obj
                return cls.instance
        return cls.instance

def task():
     m = Foo.get_instance()
     print(m)

for i in range(5):
    t=threading.Thread(target=task,)
    t.start()

 

3.基于__new__

示例:
import threading
class Foo(object):
    instance=None
    lock=threading.Lock()
    def __init__(self):
        self.a=1
        import time
        time.sleep(2)

    def __new__(cls, *args, **kwargs):
        if not cls.instance:
            with cls.lock:
                if not cls.instance:
                    obj=super(Foo,cls).__new__(cls, *args, **kwargs)
                    cls.instance=obj
                return cls.instance
        return cls.instance

def task():
    obj=Foo()
    print(obj)


for i in range(5):
    t=threading.Thread(target=task,)
    t.start()

 

4.基于metaclass

import threading

class Singleton(type):
    lock=threading.Lock()
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls,'instance'):
            with cls.lock:
                if not hasattr(cls,'instance'):
                    obj=cls.__new__(cls, *args, **kwargs)
                    obj.__init__(*args,**kwargs)
                    setattr(cls,'instance',obj)

                return getattr(cls,'instance')
        return getattr(cls,'instance')

class Foo(object,metaclass=Singleton):
    def __init__(self):
        self.name='aa'


obj1=Foo()
obj2=Foo()

print(obj1,obj2)

 

posted @ 2018-03-16 20:01  星雨5213  阅读(69)  评论(0)    收藏  举报