4、工厂模式
4、工厂模式
一、模式定义
工厂模式(Factory Pattern)是软件工程中一种创建型设计模式,它提供了一种创建对象的最佳方式,通过定义一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂模式使得一个类的实例化延迟到其子类进行。在Python中,工厂模式可以通过多种方式实现,包括简单工厂模式、工厂方法模式和抽象工厂模式。
二、实现方式
1、简单工厂模式
简单工厂模式是最基础的形式,它使用单一的工厂类来封装对象创建的过程,并根据输入参数返回不同类型的对象。这种方式的优点在于易于理解和实现,但它有一个明显的缺点:当需要添加新产品时,必须修改工厂类以支持新的产品类型,这违反了面向对象设计中的开闭原则(Open/Closed Principle)。例如:
class SimpleFactory(object):
@staticmethod
def publish_book(name):
if name == 'technical':
return TechnicalBooks()
elif name == 'literary':
return LiteraryBooks()
在这个例子中,SimpleFactory 类负责选择并创建适当的书籍对象。然而,如果想要增加一种新的书籍类型,则需要修改 publish_book 方法。
2、工厂方法模式
为了解决简单工厂模式的问题,工厂方法模式引入了一个抽象的工厂基类,并让具体的工厂子类实现具体的对象创建逻辑。这样做的好处是在不改变现有代码的情况下可以轻松地扩展新类型的产品。例如:
from abc import ABC, abstractmethod
class AbstractFactory(ABC):
@abstractmethod
def publish_book(self): pass
class TechnicalFactory(AbstractFactory):
def publish_book(self):
return TechnicalBooks()
class LiteraryFactory(AbstractFactory):
def publish_book(self):
return LiteraryBooks()
这里,AbstractFactory 定义了一个抽象方法 publish_book(),而具体的工厂如 TechnicalFactory 和 LiteraryFactory 则实现了这个方法,各自负责创建特定类型的书籍对象。
3、抽象工厂模式
抽象工厂模式进一步扩展了工厂方法模式的概念,它不仅能够创建一系列相关或相互依赖的对象,而且这些对象还可以组合成不同的家族或系列。这意味着同一个工厂可以生产多个不同类型的产品,而不需要为每种产品都创建一个新的工厂类。例如,在处理不同品牌的自行车时,我们可以有一个抽象工厂来同时生产车架和轮胎。
class AbstractBikeFactory(ABC):
@abstractmethod
def create_frame(self): pass
@abstractmethod
def create_wheel(self): pass
class FlyingPigeonFactory(AbstractBikeFactory):
def create_frame(self):
return FlyingPigeonFrame()
def create_wheel(self):
return FlyingPigeonWheel()
class ForeverFactory(AbstractBikeFactory):
def create_frame(self):
return ForeverFrame()
def create_wheel(self):
return ForeverWheel()
在这个示例中,AbstractBikeFactory 是一个抽象工厂,它有两个抽象方法分别用来创建车架和轮胎。具体的品牌工厂如 FlyingPigeonFactory 和 ForeverFactory 实现了这两个方法,从而可以创建相应品牌下的所有组件。
三、应用场景
- 简单工厂模式适合于那些需求明确且不太可能频繁变化的系统。如果未来可能会有更多种类的产品加入,那么应该考虑使用更灵活的设计。
- 工厂方法模式适用于系统中存在大量相似的对象,并且希望能够在不修改原有代码的基础上轻松添加新的对象类型。
- 抽象工厂模式则非常适合那些需要创建一组相关联的对象的情况,尤其是在各个对象之间存在着复杂的依赖关系时。