单例设计模式
设计模式
设计模式是前人工作的总结和提炼,通常,广泛流传的设计模式都是针对某一特定问题的成熟解决方案
单例设计模式
- 目的:让类创建对象,在系统中只有唯一个实例对象
- 每一侧执行类名()返回的对象、内存地址都是相同的
单例设计模式的应用场景
- 音乐播放对象(同一时间只能播放一首歌曲)
- 回收站对象(在一个操作系统中只有一个回收站)
- 打印机对象(打印10份文件只需要一个打印机)
以上对象只有唯一的一个存在
new 方法
- 使用类名()创建对象时,Python的解释器首先会调用new 方法为对象分配空间,new 方法是一个由Object类提供的内置静态方法,主要作用有两个:
- 在内存中为对象分配空间
- 返回对象的引用
- 在获得对象的引用后,将此引用作为第一个参数,传递给init方法
new 方法的重写
重写的目的:当使用类名()创建对象时,无论使用多少次,在内存中只会创建出一个对象的实例
- 重写new 方法一定要return super().new(cls)
new 重写
class musicPlayer(object):
def __new__(cls, *args, **kwargs):
#1.为对象分配空间
instance = super().__new__(cls)
#2. 返回对象的引用
return instance
def __init__(self):
print("播放器初始化")
player = musicPlayer()
print(player)
单例模式中的new 重写
class musicPlayer(object):
#记录第一个被创建对象的引用
instance = None
def __new__(cls, *args, **kwargs):
#1.判断类属性是否是空对象,如果是空对象证明还没有创建对象
if (cls.instance is None):
#2.调用父类的方法为第一个对象分配空间
cls.instance = super().__new__(cls)
#3.返回类属性保存的对象引用
return cls.instance
player1 = musicPlayer()
print(player1)
player2 = musicPlayer()
print(player2)
#输出结果: 输出结果player1 player2地址相同
执行上述代码后,每一次创建的对象地址虽然相同,但是init初始化方法仍然会在每次创建对象时被调用,现在需要初始化方法只在最初创建时调用一次:
class musicPlayer(object):
#记录第一个被创建对象的引用
instance = None
#记录是否执行过初始化方法
initFlag = False
def __new__(cls, *args, **kwargs):
#1.判断类属性是否是空对象,如果是空对象证明还没有创建对象
if (cls.instance is None):
#2.调用父类的方法为第一个对象分配空间
cls.instance = super().__new__(cls)
#3.返回类属性保存的对象引用
return cls.instance
def __init__(self):
#1. 判断是否执行过初始化方法
if (musicPlayer.initFlag == True):
return
#2. 如果没有执行过则执行初始化方法
print("初始化")
#3. 修改类属性的值
musicPlayer.initFlag = True
player1 = musicPlayer()
print(player1)
player2 = musicPlayer()
print(player2)
上述代码虽创建了两次对象,但是初始化方法init 只被调用了一次。