**
1,单例设计模式 (推荐重写new()方法)
**
class MySingleton:
__obj = None
__init_flag = True
def __new__(cls, *args, **kwargs): # cls当前的类对象
if cls.__obj is None: # 判断当前类对象下面的类属性是否为空
cls.__obj = super().__new__(cls) # 如果为空 就调用父类的new方法 分配空间(或者说是创建一个对象)
return cls.__obj
def __init__(self, name):
if MySingleton.__init_flag:
print("init....")
self.name = name
print(self.name)
MySingleton.__init_flag = False
a = MySingleton("aa")
print(a)
b = MySingleton("bb")
print(b)
运行结果为:
init....
aa
<__main__.MySingleton object at 0x000001AC1DC4D668>
<__main__.MySingleton object at 0x000001AC1DC4D668>
从运行结果可以看出:初始化方法只被执行了一次。而且两个对象返回的内存地址是相同的。
**
2,工厂模式
**
工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类,创建对象进行统一的管理和控制
class CarFactory:
def create_car(self, brand):
if brand == "奔驰":
return Benz()
elif brand == "宝马":
return BMW()
elif brand == '比亚迪':
return BYD()
else:
return "未知品牉,无法创建"
class Benz:
pass
class BMW:
pass
class BYD:
pass
factory = CarFactory()
c1 = factory.create_car("奔驰")
c2 = factory.create_car("宝马")
print(c1)
print(c2)
运行结果如下:
<__main__.Benz object at 0x0000023468A5C748>
<__main__.BMW object at 0x0000023468A5C780>
**
3,上面的工厂类可以改版成单例设计模式
**
class CarFactory:
__obj = None
__init_flag = True
def create_car(self, brand):
if brand == "奔驰":
return Benz()
elif brand == "宝马":
return BMW()
elif brand == '比亚迪':
return BYD()
else:
return "未知品牌,无法创建"
def __new__(cls, *args, **kwargs):
if cls.__obj is None:
cls.__obj = super().__new__(cls)
return cls.__obj
def __init__(self):
if CarFactory.__init_flag:
print("init CarFactory")
CarFactory.__init_flag = False
class Benz:
pass
class BMW:
pass
class BYD:
pass
factory = CarFactory()
c1 = factory.create_car("奔驰")
c2 = factory.create_car("宝马")
print(c1)
print(c2)
factory1 = CarFactory()
factory2 = CarFactory()
print(factory)
print(factory1)
print(factory2)
运行结果如下:
init CarFactory
<__main__.Benz object at 0x000001B3680CC898>
<__main__.BMW object at 0x000001B3680CC860>
<__main__.CarFactory object at 0x000001B3680CC828>
<__main__.CarFactory object at 0x000001B3680CC828>
<__main__.CarFactory object at 0x000001B3680CC828>
上面可以看到工厂的实例对象全部返回的是同一个地址
**
以上
**
如有错误 欢迎指正
欢迎 复制 粘贴 评论 转发 点赞
**
轻轻一点 好运连连
**