python工厂模式
工厂模式简介
工厂模式是一种创建对象的设计模式,它将对象的创建和使用分离。其核心思想是通过一个工厂类来负责创建对象,而不是在客户端代码中直接实例化对象。这样做的好处有:
- 降低耦合度:客户端代码不需要知道具体的对象创建细节,只需要向工厂请求所需的对象,减少了代码之间的依赖。
- 提高可维护性和可扩展性:当需要添加新的产品类型时,只需在工厂类中添加相应的创建逻辑,而不需要修改客户端代码。
下面以一段代码讲解一下实现细节:
实现一个产品基类:
import abc
from enum import Enum# 定义一个抽象基类产品
class Product(metaclass=abc.ABCMeta):@abc.abstractmethoddef operation(self):pass
- 导入模块:
abc模块用于创建抽象基类,enum模块用于创建枚举类型。 - 抽象基类
Product:使用abc.ABCMeta作为元类定义了一个抽象基类Product,并使用@abc.abstractmethod装饰器定义了抽象方法operation。这意味着所有继承自Product的具体类都必须实现operation方法。
继承抽象基类Product,并实现operation方法:
# 具体产品类 1
class ConcreteProduct1(Product):def operation(self):return "ConcreteProduct1 operation"# 具体产品类 2
class ConcreteProduct2(Product):def operation(self):return "ConcreteProduct2 operation"
- 具体产品类:
ConcreteProduct1和ConcreteProduct2继承自Product抽象基类,并实现了operation方法。每个具体产品类都有自己独特的操作实现。
用枚举类型Enum定义产品的类型:
# 产品类型枚举
class ProductType(Enum):TYPE1 = 1TYPE2 = 2
- 产品类型枚举:使用
enum.Enum定义了一个枚举类ProductType,用于表示不同类型的产品。这里定义了两种产品类型TYPE1和TYPE2。
创建一个工厂类实现生产细节:
# 工厂类
class Factory:@staticmethoddef create_product(product_type):if product_type == ProductType.TYPE1:return ConcreteProduct1()elif product_type == ProductType.TYPE2:return ConcreteProduct2()else:raise ValueError("Invalid product type")
- 工厂类
Factory:包含一个静态方法create_product,该方法接受一个product_type参数,根据传入的产品类型创建相应的产品实例。如果传入的产品类型无效,会抛出ValueError异常。
工厂实例化,传入产品类型的参数,调用函数生产产品:
# 客户端代码
if __name__ == "__main__":product1 = Factory.create_product(ProductType.TYPE1)print(product1.operation())product2 = Factory.create_product(ProductType.TYPE2)print(product2.operation())
完整代码如下:
import abc
from enum import Enum# 定义一个抽象基类产品
class Product(metaclass=abc.ABCMeta):@abc.abstractmethoddef operation(self):pass# 具体产品类 1
class ConcreteProduct1(Product):def operation(self):return "ConcreteProduct1 operation"# 具体产品类 2
class ConcreteProduct2(Product):def operation(self):return "ConcreteProduct2 operation"# 产品类型枚举
class ProductType(Enum):TYPE1 = 1TYPE2 = 2# 工厂类
class Factory:@staticmethoddef create_product(product_type):if product_type == ProductType.TYPE1:return ConcreteProduct1()elif product_type == ProductType.TYPE2:return ConcreteProduct2()else:raise ValueError("Invalid product type")# 客户端代码
if __name__ == "__main__":product1 = Factory.create_product(ProductType.TYPE1)print(product1.operation())product2 = Factory.create_product(ProductType.TYPE2)print(product2.operation())
