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>

posted @ 2024-01-24 07:53  清风旭水  阅读(22)  评论(0)    收藏  举报