工厂方法模式

65 阅读2分钟

1. 工厂方法模式简介

一句话介绍:工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于将依赖对象的创建委派给子类来决定。

2. 工厂方法模式的组成

工厂方法模式包含以下几个角色:

  1. 抽象产品(Abstract Product) :定义了产品的接口,是工厂方法模式中创建的对象的基类;
  2. 具体产品(Concrete Product) :实现了抽象产品接口的具体类,是工厂方法模式中具体的产品;
  3. 抽象工厂(Abstract Factory) :定义了工厂方法的接口,通常包含一个抽象方法用于创建产品对象;
  4. 具体工厂(Concrete Factory) :实现了抽象工厂接口的具体类,负责实例化具体的产品对象。

3. 使用场景以及优缺点

使用场景:

  • 当一个类无法预知它必须创建哪种类型的依赖对象、或者不清楚该依赖对象的依赖关系时,可以使用工厂方法模式;
  • 当一个类希望将依赖对象的创建延迟到子类中,或者希望通过子类来定制依赖对象的创建过程时,可以使用工厂方法模式。

优点:

  • 将对象的创建与使用相分离,使得系统更加灵活,易于扩展和维护;
  • 可以通过子类来定制依赖对象的创建过程,增加了系统的灵活性和可定制性;
  • 符合开闭原则,新增具体产品类时无需修改现有代码,只需要增加相应的具体工厂类即可。

缺点:

  • 每增加一个具体产品类,都需要新增一个对应的具体工厂类,导致类的数量增加,系统变得更加复杂。

4. 使用Python实现

下面是一个使用 Python 实现工厂方法模式的简单示例:

from abc import ABC, abstractmethod

# 抽象产品类
class Product(ABC):
    @abstractmethod
    def operation(self):
        pass

# 具体产品类A
class ConcreteProductA(Product):
    def operation(self):
        return "具体产品A的操作"

# 具体产品类B
class ConcreteProductB(Product):
    def operation(self):
        return "具体产品B的操作"

# 抽象工厂类
class Factory(ABC):
    @abstractmethod
    def create_product(self):
        pass

# 具体工厂类A
class ConcreteFactoryA(Factory):
    def create_product(self):
        return ConcreteProductA()

# 具体工厂类B
class ConcreteFactoryB(Factory):
    def create_product(self):
        return ConcreteProductB()

# 客户端代码
if __name__ == "__main__":
    # 使用具体工厂A创建具体产品A
    factory_a = ConcreteFactoryA()
    product_a = factory_a.create_product()
    print(product_a.operation())

    # 使用具体工厂B创建具体产品B
    factory_b = ConcreteFactoryB()
    product_b = factory_b.create_product()
    print(product_b.operation())

在这个示例中,我们定义了抽象产品类 Product 和具体产品类 ConcreteProductAConcreteProductB。同时,定义了抽象工厂类 Factory 和具体工厂类 ConcreteFactoryAConcreteFactoryB。客户端代码通过具体工厂类来创建具体产品对象,而不需要直接实例化具体产品类,从而实现了工厂方法模式。

5. 参考资料