单例

单例模式
一种设计模式,MVVM MVC MTV
常推荐书籍常见设计模式

要保证一个类只能有一个实例(单例)

为什么这么设计?
目的是为了节省内存开销
如果两个对象的数据一模一样 就没有必要创建新对象 直接使用已有的即可

场景:
当一个类的所有实例数据都完全相同时 则应该设计为单例
音乐播放器类 实例化产生播放器对象

单例的实现方式:
自定义元类 覆盖__call__ 添加判断逻辑 保证只能实例化一个对象

"""
class MySingleton(type):
obj = None
def __call__(self, *args, **kwargs):
if not self.obj:
# 创建空对象
obj = object.__new__(self)
# 调用初始化方法
self.__init__(obj, *args, **kwargs)
self.obj = obj
return self.obj


class Player(metaclass=MySingleton):
# 默认为空
obj = None

def __init__(self):
print("创建了一个播放器对象....")

def play(self,path):
self.stop()
print("playing...",path)

def stop(self):
print("stop music")

# 用于获取播放器对象
@classmethod
def get_player(cls):
if not cls.obj:
print("创建播放器...")
cls.obj = cls()
return cls.obj
p1 = Player.get_player()
p1.play("爱你一万年1.")


p2 = Player.get_player()
p2.play("爱你一万年2.")

Player().play("我的滑板鞋!")

通过控制实例化对象 保证只创建一个对象来调用函数方法
posted @ 2019-03-24 19:50  夜晚的潜水艇  阅读(106)  评论(0)    收藏  举报