首页 > 其他 > 详细

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

时间:2018-10-15 23:50:00      阅读:226      评论:0      收藏:0      [点我收藏+]

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

 

 

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, *args, **kwargs)

        return cls._instance

 

class Myclass(Singleton):

    a = 1

 

a1 = Myclass()

a2 = Myclass()

print(a1 == a2, a1 is a2)

 

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

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

原文:https://www.cnblogs.com/wodeboke-y/p/9795282.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!