# 面向对象的单例设计模式
# 普通模式
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
obj1 = Person('小明',20)
obj2 = Person('小红',25)
obj3 = Person('小蓝',30)
print(id(obj1),id(obj2),id(obj3)) # 输出==>53414896 53414928 53415024
# 单例模式
# 实现方式:
# 1.创建一个类静态字段(类变量)__instance
# 2.创建一个类方法,判断__instance是否存在,不存在则将对象赋值给__instance,即__instance = 类();
如果存在,则直接调用返回__instance,这样创建的对象地址都是一样的
class Foo:
__v = None
def __init__(self):
pass
@classmethod
def get__instance(cls):
if cls.__v:
return cls.__v
else:
cls.__v = Foo()
return cls.__v
obj4 = Foo.get__instance()
obj5 = Foo.get__instance()
obj6 = Foo.get__instance()
print(id(obj4),id(obj5),id(obj6)) # 输出 ==> 53415056 53415056 53415056
class Foo(object):
__obj = None
def __new__(cls, *args, **kwargs):
if not cls.__obj:
cls.__obj = super().__new__(cls)
return cls.__obj
else:
return cls.__obj
def __init__(self,name):
self.name = name
def say(self):
print(self.name)
a = Foo("horns")
b = Foo('xm')
a.say()
b.say()
# 当业务并发量很大的时候,按照以往的模式,一个请求创建一个对象,就会创建一个新的空间,如果同时创建了三个对象,比如
# obj1,obj2,obj3,他们实现了相同的功能(通过person实例化出来的一个对象,拥有同样的属性和方法,只有名字不一样),这样会
造成内存和进程的浪费。为了解决这个问题(问题:让这些拥有相同方法的对象都有同样的内存地址)于是产生了单例模式。
#通过单例模式制造出来的对象拥有相同的地址。