单例

作者: 她即我命 | 来源:发表于2018-12-01 15:43 被阅读2次
"""
单例模式 - 一个类只能创建出唯一的一个对象
无状态对象或对象状态是共享的 这样的对象通常可以设计为单例对象
"""
from functools import wraps


# 装饰类的装饰器 - 被装饰的不是函数而是一个类
# singleton函数中的instances虽然是一个局部变量
# 但是由于singleton函数返回的wrapper函数使用了该变量
# 所以它的生命周期会被延长(相当于是局部变量拥有了全局生命周期)
# 这种现象就称之为闭包(closure)
def singleton(cls):
    instances = {}

    @wraps(cls)
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


class A(object):

    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance

    def __init__(self, name):
        self.name = name


@singleton
class President(object):

    def __init__(self, name, year):
        self.name = name
        self.year = year


def main():
    s1 = A('王大锤')
    s2 = A('白元芳')
    print(s1.name)
    print(s2.name)
    print(s1 == s2)
    print(id(s1))
    print(id(s2))
    President2 = President.__wrapped__
    p1 = President2('奥巴马', 4)
    p2 = President2('特朗普', 4)
    print(p1 == p2)
    print(p1.name, p2.name)


if __name__ == '__main__':
    main()

相关文章

  • Android设计模式总结

    单例模式:饿汉单例模式://饿汉单例模式 懒汉单例模式: Double CheckLock(DCL)实现单例 Bu...

  • IOS单例模式的底层原理

    单例介绍 本文源码下载地址 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一...

  • 【设计模式】单例模式

    单例模式 常用单例模式: 懒汉单例模式: 静态内部类单例模式: Android Application 中使用单例模式:

  • 2020-11-02-Spring单例 vs. 单例模式

    Spring 单例不是 Java 单例。本文讨论 Spring 的单例与单例模式的区别。 前言 单例是 Sprin...

  • IOS学习笔记之单例

    单例介绍 1.什么是单例 说到单例首先要提到单例模式,因为单例模式是单例存在的目的 单例模式是一种常用的软件设计模...

  • OC - 单例模式

    导读: 一、什么是单例模式 二、单例的作用 三、常见的单例类 四、自定义单例类的方法 一、什么是单例模式 单例模式...

  • 单例

    单例 单例宏

  • 单例模式

    特点 单例类只有1个实例对象 该单例对象必须由单例类自行创建 单例类对外提供一个访问该单例的全局访问点 结构 单例...

  • 关于java单例模式,这篇已经讲得很清楚了,建议收藏!

    概念 java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。 特点 单例...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

网友评论

      本文标题:单例

      本文链接:https://www.haomeiwen.com/subject/rkhrcqtx.html