美文网首页
实现单例的几种成熟设计模式

实现单例的几种成熟设计模式

作者: 托贝多尔 | 来源:发表于2022-03-18 19:52 被阅读0次

装饰器方式

作为类装饰器,实现单例

import threading
def singleton(cls):
    _instance_lock = threading.Lock()
    _instance = {}

    def _singleton(*args, **kwargs):
        if cls not in _instance:  # 没有实例要重新创建才加锁
            with _instance_lock:
                if cls not in _instance:  # 确认加锁时没有新实例(加锁存在时间差)
                    _instance[cls] = cls(*args, **kwargs)
        return _instance[cls]

    return _singleton

@singleton
class Mytest:
       def __init__(self):
        time.sleep(1)

改写new方式

可以被继承,子类也是单例

import threading
class Singleton:
    _instance_lock = threading.Lock()
    # _instance = None
    # def __new__(cls, *args, **kwargs):
    #     if not cls._instance:  # 没有实例要重新创建才加锁
    #         with cls._instance_lock:
    #             if not cls._instance:  # 确认加锁时没有新实例(加锁存在时间差)
    #                 cls._instance = object.__new__(cls)
    #     return cls._instance
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):  # 没有实例要重新创建才加锁
            with Singleton._instance_lock:
                if not hasattr(cls, "_instance"):  # 确认加锁时没有新实例(加锁存在时间差)
                    Singleton._instance = object.__new__(Singleton)
        return Singleton._instance

class TestSingleton(Singleton):
    def __init__(self, *args, **kwargs):
        super(TestSingleton, self).__init__(*args, **kwargs)
        time.sleep(1)

改写type元类方式实现

import threading
class MetaSingleton(type):
    _instance_lock = threading.Lock()
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances: # 没有实例要重新创建才加锁
            with MetaSingleton._instance_lock:
                if cls not in cls._instances: # 确认加锁时没有新实例(加锁存在时间差)
                    cls._instances[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class TestMetaSingleton(metaclass=MetaSingleton):
    def __init__(self, *args, **kwargs):
        self.name = 'a'
        time.sleep(1)

总结:元类(metaclass) 可以通过方法 metaclass 创造了类(class),而类(class)通过方法 new 创造了实例(instance)

相关文章

  • 设计模式

    手写单例模式(线程安全) 你知道几种设计模式?单例模式是什么?Spring中怎么实现单例模式?

  • 单例模式只有饿汉式和懒汉式吗?这几种单例模式你见过吗

    设计模式之单例模式-单例模式的几种实现方式及小案例 本文出处:凯哥Java(wx:kaigejava) 单例模式有...

  • java设计模式之单例模式

    单例模式属于java设计模式的一种,最常见实现方式有以下几种 懒汉、饿汉、双重检查单例、静态内部类单例。 单例模式...

  • 实现单例的几种成熟设计模式

    装饰器方式 作为类装饰器,实现单例 改写new方式 可以被继承,子类也是单例 改写type元类方式实现 总结:元类...

  • 单例模式

    单例设计模式是几种设计模式中比较容易理解的,手写单例模式也是面试频繁问到的。下面总结一下单例模式的几种写法: //...

  • 设计模式第二篇、单例设计模式

    目录1、什么是单例设计模式2、单例设计模式的简单实现3、单例设计模式面临的两个问题及其完整实现4、单例设计模式的应...

  • 单例设计模式

    单例设计模式是用的最多的设计模式,也是最简单的一中设计模式。下面来介绍下几种实现单例的方式,以及分析下各自的优缺点...

  • 设计模式

    常用的设计模式:单例模式,工厂模式,观察者模式,代理模式,其他的我使用不多。单例模式最常见也最简单分为几种实现:懒...

  • 2018-06-19 Python中的单例模式的几种实现方式的及

    转载自: Python中的单例模式的几种实现方式的及优化 单例模式 单例模式(Singleton Pattern)...

  • java中实现单例模式的几种方式?

    java中实现单例模式的几种方式?

网友评论

      本文标题:实现单例的几种成熟设计模式

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