Python设计模式,可以采用单例模式+工厂方法吗?

背景:

今天看卡尔的设计模式,突然间,觉得可以把单例模式+工厂方法结合起来。

不知道能不能行,咨询下AI,觉得可以。

就mark一下

问题:

  • python中我有一个项目,有4个场景,我想创建一个基类,然后写4个具体实现的工厂,并继承这个基类,我为了防止这个基类创建多次,我是不是可以用单例模式?也就说我可以把设计模式中的【工厂方法】和【单例模式】结合起来了?

AI回答(chatGPT-4):

 

是的,你可以将工厂方法模式和单例模式结合起来使用。在这种情况下,你的目标是确保每个场景的工厂类只有一个实例,并且这些工厂类都继承自一个基类。这样做的好处是可以确保对于每个场景,都只有一个工厂实例在程序的生命周期内被创建和使用,这有助于节省资源并避免重复创建对象。

基类的单例模式

首先,你可以创建一个基类,并使用单例模式确保这个基类只能实例化一次。单例模式通常是通过隐藏构造函数,并提供一个静态方法来实现的,这个静态方法会检查实例是否已经存在,如果不存在则创建它。

class SingletonMeta(type):
    _instances = {}
    
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class BaseFactory(metaclass=SingletonMeta):
    def create(self):
        raise NotImplementedError("Create method not implemented.")

具体工厂类

然后,对于每个场景,你可以创建一个具体的工厂类,这些工厂类继承自基类,并实现基类中的create方法。

class FactoryA(BaseFactory):
    def create(self):
        return "ProductA created"

class FactoryB(BaseFactory):
    def create(self):
        return "ProductB created"

class FactoryC(BaseFactory):
    def create(self):
        return "ProductC created"

class FactoryD(BaseFactory):
    def create(self):
        return "ProductD created"

使用工厂

现在,无论你何时需要一个场景的工厂实例,你都可以直接调用它,而不用担心会创建多个实例。

factory_a = FactoryA()
print(factory_a.create())

factory_a2 = FactoryA()
print(factory_a is factory_a2)  # True, indicating it is a singleton

这样,你就结合了工厂方法模式和单例模式。工厂方法模式允许你在基类中定义一个创建对象的接口,让子类决定实例化哪一个类。单例模式确保了每个工厂类只有一个实例。结合使用这两种模式,可以在需要时为每个场景提供一个唯一的工厂实例,同时保持了代码的灵活性和扩展性。

参考资料:

卡尔设计模式

posted @ 2024-03-20 13:31  o蹲蹲o  阅读(5)  评论(0编辑  收藏  举报