工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供一个接口用于创建对象,但由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类,从而使得代码更加灵活和可扩展。
- 工厂方法模式的结构
工厂方法模式通常包含以下几个角色:
产品接口(Product):定义了工厂方法所创建的对象的接口。
具体产品(ConcreteProduct):实现了产品接口的具体类。
工厂接口(Creator):声明了一个工厂方法,返回一个产品对象。
具体工厂(ConcreteCreator):实现工厂接口,负责创建具体产品的实例。
- 工厂方法模式的 UML 图
plaintext
+-----------------+ +-----------------++-----------------+ | Creator | +-----------------+ | + factoryMethod()| +-----------------+ / \ | +-----------------+ | |
| ConcreteCreator | | ConcreteCreator2|
+-----------------+ +-----------------+
| + factoryMethod()| | + factoryMethod()|
+-----------------+ +-----------------+
+-----------------+ +-----------------+| | v v
| ConcreteProduct | | ConcreteProduct2|
+-----------------+ +-----------------+ - 工厂方法模式的实现
以下是一个 Python 中工厂方法模式的简单示例:
3.1 定义产品接口
python
from abc import ABC, abstractmethod
class Product(ABC):
@abstractmethod
def operation(self) -> str:
pass
3.2 实现具体产品
python
class ConcreteProductA(Product):
def operation(self) -> str:
return "Result of ConcreteProductA"
class ConcreteProductB(Product):
def operation(self) -> str:
return "Result of ConcreteProductB"
3.3 定义工厂接口
python
class Creator(ABC):
@abstractmethod
def factory_method(self) -> Product:
pass
def some_operation(self) -> str:
product = self.factory_method()
return f"Creator: The same creator's code has just worked with {product.operation()}"
3.4 实现具体工厂
python
class ConcreteCreatorA(Creator):
def factory_method(self) -> Product:
return ConcreteProductA()
class ConcreteCreatorB(Creator):
def factory_method(self) -> Product:
return ConcreteProductB()
3.5 使用工厂方法
python
def client_code(creator: Creator) -> None:
print(creator.some_operation())
if name == "main":
creator_a = ConcreteCreatorA()
client_code(creator_a) # 输出: Creator: The same creator's code has just worked with Result of ConcreteProductA
creator_b = ConcreteCreatorB()
client_code(creator_b) # 输出: Creator: The same creator's code has just worked with Result of ConcreteProductB
- 工厂方法模式的优缺点
优点
解耦:客户端代码与具体产品的实现细节解耦,便于扩展和维护。
提高灵活性:可以根据实际需要添加新的产品,而无需修改已有代码。
符合开闭原则:对扩展开放,对修改关闭,可以在不修改现有代码的情况下添加新产品。
缺点
增加复杂性:引入额外的类和接口可能会导致系统的复杂性增加。
难以理解:对于简单场景,工厂方法模式可能显得过于复杂。 - 何时使用工厂方法模式
当一个类不知道它所需要的对象的类时。
当一个类希望通过子类来指定它所创建的对象时。
当一个类要将实例化操作延迟到子类时。 - 总结
工厂方法模式是软件设计中的一种重要模式,通过定义一个创建对象的接口,使得子类决定具体的实例化过程,从而提高了代码的灵活性和可维护性。在实际开发中,根据需求合理选择是否使用工厂方法模式,有助于构建更清晰和可扩展的系统。