单态模式

# ### 单态模式 
'''无论实例化多少次,都有且只有一个对象.'''
'''最终目的:为了节省内存空间.应用的场景是只调用相关的成员属性或方法,而不用动态添加成员属性方法的环境中'''

"""
__obj 变成私有,控制不让用户在类外直接获取obj,而是用__new__来控制返回的逻辑
先判断cls.__obj 是不是None
如果是None,代表是一个空的对象,那么就利用父类的__new__方法来创建对象
如果不是一个空对象,代表先前早已实例化过了一个对象
就把这个对象给他返回
"""
# (1) 基本用法
class Singleton():
	__obj = None
	def __new__(cls):
		if cls.__obj is None:
			# 借助父类创建对象
			obj = object.__new__(cls)
			# 把这个对象赋值给类中成员属性__obj
			cls.__obj = obj
		return cls.__obj

# 第一次创建时,因为cls.__obj 是None 所以创建一个对象
obj = Singleton()
print(obj)
# 第二次实例化时,因为cls.__obj 不是None ,直接返回上一次创建的那个对象
obj = Singleton()
print(obj)
# 第三次实例化时,同第二次
obj = Singleton()
print(obj)
obj = Singleton()
print(obj)
obj = Singleton()
print(obj)

# (2) 改造
class Singleton():
	__obj = None
	def __new__(cls,*args,**kwargs):
		if cls.__obj is None:
			cls.__obj = object.__new__(cls)
		return cls.__obj 
		
	def __init__(self,name):
		self.name = name
		
obj1 = Singleton("王波")

obj2 = Singleton("方真强")
print(obj1.name)
print(obj2.name)


"""
第一次是创建对象,并且通过init初始化对象,为该对象赋值成员属性name
self.name = 王波

第二次是直接返回上一个对象,然后对他进行初始化,为该对象赋值成员属性name
self.name = 方真强

两个不同的变量名指向的是同一个对象
而此时该对象的成员属性name 这个值是方真强
print(obj1.name)
print(obj2.name)
打印的都是方真强
"""

  

猜你喜欢

转载自www.cnblogs.com/huangjiangyong/p/10920634.html