python 工厂模式和单例模式
工厂模式
class Benz:pass
class BMW: pass
class BYD: pass
class CarFactory:
def createCar(self, brand):
if brand == "奔驰":
return "奔驰"
elif brand == "宝马":
return "宝马"
elif brand == "比亚迪":
return "比亚迪"
else:
return "未知"
factory = CarFactory()
c1 = factory.createCar("奔驰")
c2 = factory.createCar("宝马")
print(c1, c2)
print(id(c1), id(c2))
输出结果
奔驰 宝马
4414044080 4414044272
单例模式
class MySingLeton:
__obj = None
__init_flag = True
def __new__(cls, *args, **kwargs):
if cls.__obj == None:
cls.__obj = object.__new__(cls)
return cls.__obj
def __init__(self, name):
if MySingLeton.__init_flag:
print("初始化第一个对象")
self.name = name
MySingLeton.__init_flag = False
a = MySingLeton("aa")
b = MySingLeton("bb")
print(a,b)
输出结果
初始化第一个对象
<__main__.MySingLeton object at 0x104163ca0> <__main__.MySingLeton object at 0x104163ca0>
单例模式配合工厂模式,id都不一样感觉这种是错的,
class CarFactory:
__obj = None
__init_flag = True
def __new__(cls, *args, **kwargs):
if cls.__obj == None:
cls.__obj = object.__new__(cls)
return cls.__obj
def __init__(self):
if CarFactory.__init_flag:
# print("初始化第一个对象")
CarFactory.__init_flag = False
def createCar(self, brand):
if brand == "奔驰":
return "奔驰"
elif brand == "宝马":
return "宝马"
elif brand == "比亚迪":
return "比亚迪"
else:
return "未知"
factory = CarFactory()
cc = factory.createCar("奔驰")
cc1 = factory.createCar("宝马")
print(cc, cc1)
print(id(cc), id(cc1))
factory1 = CarFactory()
b3 = factory1.createCar("奔驰")
b4 = factory.createCar("宝马")
print(b3, b4)
print(id(b3), id(b4))
输出结果
奔驰 宝马
4565678000 4565678192
奔驰 宝马
4565678000 4565678192
下面这种感觉是对的,但是扩展如何用呢
class CarFactory:
__obj = None
__init_flag = True
def __new__(cls, *args, **kwargs):
if cls.__obj == None:
cls.__obj = object.__new__(cls)
return cls.__obj
def __init__(self):
if CarFactory.__init_flag:
CarFactory.__init_flag = False
print("初始化第一个对象")
# return self
def createCar(self, brand):
if brand == "奔驰":
return self # 使用self作为返回值
elif brand == "宝马":
return CarFactory() # 对于其他品牌返回一个新的CarFactory实例
else:
return CarFactory() # 其他情况也应该返回一个新的CarFactory实例
factory = CarFactory()
cc = factory.createCar("123")
cc1 = factory.createCar("宝马")
cc2 = factory.createCar("奔驰")
print(id(cc), id(cc1)) # 这里会显示两次的ID是相同的(它们是同一个对象)
print(cc) # 打印cc以检查它是否是CarFactory的一个实例
print(cc1)
print(cc2)
输出结果
初始化第一个对象
4502896064 4502896064
<__main__.CarFactory object at 0x10c64bdc0>
<__main__.CarFactory object at 0x10c64bdc0>
<__main__.CarFactory object at 0x10c64bdc0>
记录生命的成长,愿岁月不会辜负每一个勇往向前的人