1. 工厂方法模式简介
一句话介绍:工厂方法模式(Factory Method Pattern)是一种创建型设计模式,用于将依赖对象的创建委派给子类来决定。
2. 工厂方法模式的组成
工厂方法模式包含以下几个角色:
- 抽象产品(Abstract Product) :定义了产品的接口,是工厂方法模式中创建的对象的基类;
- 具体产品(Concrete Product) :实现了抽象产品接口的具体类,是工厂方法模式中具体的产品;
- 抽象工厂(Abstract Factory) :定义了工厂方法的接口,通常包含一个抽象方法用于创建产品对象;
- 具体工厂(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 和具体产品类 ConcreteProductA 和 ConcreteProductB。同时,定义了抽象工厂类 Factory 和具体工厂类 ConcreteFactoryA 和 ConcreteFactoryB。客户端代码通过具体工厂类来创建具体产品对象,而不需要直接实例化具体产品类,从而实现了工厂方法模式。