简介
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。确保一个类只有一个实例存在,也就是说在整个系统中,如果你希望某个类只能出现一个实例,那么单例模式就派上用场了。
单例模式的优缺点
优点:
- 在内存中只有一个对象,减少内存开支;
- 可以避免频繁的创建销毁对象,可以提高性能;
- 可以避免对资源的多重占用;
- 为整个系统提供一个全局访问点。
缺点:
- 单例模式没有抽象层,扩展很困难;
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
- 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;
在上代码之前,我们需要明确两个魔法方法的区别
__new__和__init__的区别
根据官方文档:
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。
也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
博主实现单例模式的思路是,在__new__中判断当前是否已经存在示例,如果存在,则直接返回存在的实例。
下面我们看看代码:
单例模式的实现
class Single_Class():
#用于存放实例
__instance = None
#判断是否是第一次初始化
__first_init = False
def __new__(cls, name, age):
# 如果类属性__instance的值为None,那么就创建一个对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
# 如果已经有实例存在,直接返回
return cls.__instance
# 只执行一次init方法
def __init__(self, name, age):
if not self.__first_init:
self.name = name
self.age = age
self.__first_init = True
下面我们进行测试:
firstmam = Single_Class("Jack",19)
secondman = Single_Class('Bob',21)
print(id(firstmam),"name:",firstmam.name,"age:",firstmam.age)
print(id(secondman),"name:",secondman.name,"age:",secondman.age)
"""打印结果为:
3146062917080 name: Jack age: 19
3146062917080 name: Jack age: 19
"""
以上就是博主今天给大家分享的内容了,希望大家能够有所收获,祝大家学习进步。