单例与单例模式

本文详细介绍了Python中实现单例模式的四种常见方法:利用`__new__`方法、导入机制、元类以及装饰器。单例模式主要用于确保某个类只有一个实例,并提供一个全局访问点。常见应用场景包括资源管理器、系统组件等,以避免资源冲突和多头管理。文章通过实例代码展示了如何创建和使用单例,帮助读者理解并掌握这一设计模式。
摘要由CSDN通过智能技术生成

单例概念

单例用途

单例构造方法

单例概念

单例:一种创建类型的常见软件设计方式,可以通过单例模式使得我们我们运行的当前进程之中只存在一个实例。通俗点讲就相当于向外提供了一个可供操作的窗口(该实例对象),进而后续所有的操作均在一个实例对象上进行。
上述可知,单例模式存在三个关键点:
1:单例类中只能存在一个实例对象
2:单例类内部自己要实现这个实例对象
3:返回创建的实例对象,供外部使用

单例用途(cite from baidubaike)

一些资源管理器常常设计成单例模式。

在计算机系统中,需要管理的资源包括软件外部资源,譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中。每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。
需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。

需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可整出多头。
这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。

单例构造方法

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,
通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持
的引	用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,
这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例

方法一:new方法

__new__方法
class Singleton(object):
    __instance = None

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

s1 = Singleton()
s2 = Singleton()
print(s1, s2)

方法二:python特有取巧方式,利用包的只导入一次的机制
在这里插入图片描述

# 外部引入方式
# 另开辟一个文件,将创建的对象导入进来
from 对象 import a

print(a)
print(a)
print(a)

方法三:元类,点我!!!

# 以元类的方式创建一个单例模式
class MyMeta(type):

    def __init__(self,class_name,class_base,class_dict):
        self.__instance = None

    def __call__(self, *args, **kwargs):

        if self.__instance == None:
            self.__instance = self.__new__(self)
        self.__init__(self.__instance,*args,**kwargs)
        return self.__instance

class Singleton(object,metaclass=MyMeta):

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

    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)

a = Singleton("小明",18)
b = Singleton("小红",19)
c = Singleton("小花",21)
print(a.name,a)
print(b.name,b)
print(c.name,c)

方法四:装饰器

# 以装饰器创建一个单例模式

def Singleton(func):
    instance = dict()
    def inner():
        if func not in instance:
            instance[func] = func()
        return instance[func]
    return inner

@Singleton # Add = Singleton(Add)
class Add(object):

    def __init__(self):
        pass

    def add(self,x,y):
        return x+y
a = Add()
b = Add()
print(a)
print(b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值