单例概念
单例用途
单例构造方法
单例概念
单例:一种创建类型的常见软件设计方式,可以通过单例模式使得我们我们运行的当前进程之中只存在一个实例。通俗点讲就相当于向外提供了一个可供操作的窗口(该实例对象),进而后续所有的操作均在一个实例对象上进行。
上述可知,单例模式存在三个关键点:
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)