创建型设计模式-工厂模式(Factory Pattern)- python实现
设计模式汇总:查看
工厂模式(Factory Pattern)是软件设计中常用的一种创建型设计模式,它的主要目的是用于创建对象,同时隐藏创建逻辑,而不是通过直接使用new运算符实例化对象,这样可以提高程序的灵活性。
工厂模式的核心组成
抽象产品(Product):定义了产品的接口,描述了所有实例化对象的共同操作。
具体产品(Concrete Product):实现了抽象产品接口的具体类。
抽象工厂(Factory):提供了一个用于创建产品的接口,它通常包含一个工厂方法,此方法返回一个产品类型的实例。
具体工厂(Concrete Factory):实现了抽象工厂的工厂方法,决定了具体创建哪一个产品类。
工厂模式的分类
- 简单工厂模式:一个工厂类负责创建所有类型的产品,客户端通过参数来决定创建哪种产品。
- 工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
具体参考:抽象工厂模式-python实现
工厂模式的用途
- 当一个类不知道它必须创建哪些具体的对象时。
- 当一个类希望由其子类来指定创建的对象时。
- 当类将创建的对象集合起来,以实现特定的工厂方法时。
工厂模式的优点
- 解耦:减少了客户代码和具体产品类之间的直接依赖关系。
- 扩展性:新增产品类时,不需要修改已有系统代码。
- 维护性:集中创建逻辑,易于维护。
Python中的工厂模式示例
以下是一个工厂方法模式的Python示例:
from abc import ABC, abstractmethod
class Creator(ABC):
@abstractmethod
def factory_method(self):
"""
定义了一个工厂方法的接口。
该方法是一个抽象方法,旨在被子类实现。子类应该根据自己的需求覆盖这个方法,
提供具体的对象创建逻辑。工厂方法的设计模式允许子类决定实例化哪一个类,
从而使系统更具可扩展性和灵活性。
返回:
无具体返回值,但子类实现时应该返回一个对象,该对象的类型是根据子类的实现决定的。
"""
pass
def some_operation(self):
"""
执行特定操作,该操作涉及到使用工厂方法创建的产品。
本方法展示了一个典型的使用工厂方法模式的场景,其中创建了一个产品对象,并使用该对象执行了一些操作。
返回的结果字符串中包含了产品执行操作后的信息,强调了同一创建者创建的产品可以无缝协作。
返回:
一个字符串,包含了操作的结果和产品信息。
"""
# 使用工厂方法获取产品实例
product = self.factory_method()
# 构造操作结果的字符串,强调了产品之间的协作关系
result = f"Creator: The same creator's code has just worked with {product.operation()}"
return result
class ConcreteCreator1(Creator):
"""
具体创建者1类,继承自Creator类。
它实现了Creator类中的工厂方法,返回一个具体的产品1。
"""
def factory_method(self):
"""
生产具体产品1。
返回:
ConcreteProduct1: 具体产品1的实例。
"""
return ConcreteProduct1()
class ConcreteCreator2(Creator):
"""
具体创建者2类,继承自Creator类。
它实现了Creator类中的工厂方法,返回一个具体的产品2。
"""
def factory_method(self):
"""
生产具体产品2。
返回:
ConcreteProduct2: 具体产品2的实例。
"""
return ConcreteProduct2()
class Product(ABC):
"""
产品类的抽象基类。
该类为所有具体产品类的父类,定义了产品类必须实现的操作。
"""
@abstractmethod
def operation(self):
"""
抽象方法,具体产品类必须实现该方法。
该方法定义了产品类的共同行为,每个具体产品类都需要根据自己的特点实现该方法。
"""
pass
class ConcreteProduct1(Product):
"""
具体产品1类,实现了产品接口。
这个类代表了产品的一种具体实现,ConcreteProduct1提供了特定的operation方法实现。
"""
def operation(self):
"""
执行具体操作。
"""
return "{Result of ConcreteProduct1}"
class ConcreteProduct2(Product):
"""
具体产品2类,实现了产品接口。
这个类代表了产品的一种具体实现,ConcreteProduct2提供了另一种特定的operation方法实现。
"""
def operation(self):
"""
执行具体操作。
"""
return "{Result of ConcreteProduct2}"
if __name__ == "__main__":
# 创建具体创建者1
creator1 = ConcreteCreator1()
# 使用创建者1创建产品
result1 = creator1.some_operation()
print(result1)
# 创建具体创建者2
creator2 = ConcreteCreator2()
# 使用创建者2创建产品
result2 = creator2.some_operation()
print(result2)