授课语音

工厂模式和抽象工厂模式

1. 介绍

工厂模式和抽象工厂模式是面向对象设计中常用的两种设计模式,旨在解耦对象的创建过程和使用过程,从而增强系统的灵活性和可维护性。

工厂模式

工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,由子类决定实例化哪个类。工厂模式将对象的实例化推迟到子类,从而提高了系统的灵活性。

应用场景:

  1. 需要大量创建对象的情况:当对象的创建过程复杂,或需要创建的对象可能发生变化时,使用工厂模式可以集中管理对象的创建。
  2. 类不知道需要的对象具体类:例如,某个操作系统的接口,但不确定具体实现的操作系统类型。
  3. 通过子类实例化满足需求:当类希望通过子类来决定具体对象的创建,以避免直接依赖具体实现类。

优点:

  1. 降低耦合度:客户端代码不需要知道创建对象的具体类,只需了解工厂方法。
  2. 增强灵活性:可以通过更改子类的实现方便地扩展系统。
  3. 集中控制对象的创建过程:统一管理对象的创建逻辑,易于维护和扩展。

缺点:

  • 增加系统复杂度:需要创建多个工厂类,可能引入多个接口。

抽象工厂模式

抽象工厂模式也是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而不需要指定具体类。通过定义一个抽象工厂接口,允许子类实现该接口以生成相关对象。

应用场景:

  1. 需要创建一系列相关联的对象:例如创建一套用户界面的控件(按钮、对话框、文本框等)。
  2. 系统需要独立于对象的创建和组合过程:通过一组共同的接口来管理对象,与对象的具体实现解耦。
  3. 支持多种系列的对象创建:如支持不同风格的用户界面(Windows风格、Mac风格)时,抽象工厂模式能够有效管理这些不同系列的对象。

优点:

  1. 可以创建一系列相关的对象:通过统一接口创建一组相关对象,确保一致性和兼容性。
  2. 解耦具体产品实现:客户端代码不依赖于具体产品的实现,仅依赖于抽象接口。
  3. 增加系统扩展性:可以轻松增加新产品系列而无需修改现有代码。

缺点:

  1. 引入更多抽象层次:增加了系统的复杂度,需要处理更多的工厂类和接口。
  2. 产品族变化可能需更改代码:当产品族变化较大时,可能需要修改工厂实现代码。

总结比较

  • 工厂模式侧重于提供创建单一产品对象的接口,主要用于解决具体对象的创建问题。
  • 抽象工厂模式则更为全面,解决创建一系列相关产品对象的问题,适合需要多个对象协调工作的场景。

2. 代码案例

from abc import ABC, abstractmethod


# =================== 工厂模式(Factory Method Pattern) ===================
# Vehicle 是抽象基类,定义了车辆的 drive 方法。
class Vehicle(ABC):
    @abstractmethod
    def drive(self):
        pass


# 具体车辆实现:轿车
class Sedan(Vehicle):
    def drive(self):
        print("驾驶轿车")


# 具体车辆实现:SUV
class SUV(Vehicle):
    def drive(self):
        print("驾驶SUV")


# 车辆工厂接口,声明工厂方法
class VehicleFactory(ABC):
    @abstractmethod
    def create_vehicle(self) -> Vehicle:
        pass


# 具体工厂A,生产轿车
class SedanFactory(VehicleFactory):
    def create_vehicle(self) -> Vehicle:
        return Sedan()


# 具体工厂B,生产SUV
class SUVFactory(VehicleFactory):
    def create_vehicle(self) -> Vehicle:
        return SUV()


# =================== 抽象工厂模式(Abstract Factory Pattern) ===================
# Computer 是抽象基类,定义了计算机的 assemble 方法。
class Computer(ABC):
    @abstractmethod
    def assemble(self):
        pass


# 办公计算机的具体实现:办公台式机
class OfficeDesktop(Computer):
    def assemble(self):
        print("组装办公台式机")


# 办公计算机的具体实现:办公笔记本
class OfficeLaptop(Computer):
    def assemble(self):
        print("组装办公笔记本")


# 游戏计算机的具体实现:游戏台式机
class GamingDesktop(Computer):
    def assemble(self):
        print("组装游戏台式机")


# 游戏计算机的具体实现:游戏笔记本
class GamingLaptop(Computer):
    def assemble(self):
        print("组装游戏笔记本")


# 抽象工厂接口,定义创建计算机的方法
class ComputerFactory(ABC):
    @abstractmethod
    def create_desktop(self) -> Computer:
        pass

    @abstractmethod
    def create_laptop(self) -> Computer:
        pass

    @abstractmethod
    def assemble_computers(self):
        pass


# 办公计算机工厂,生产办公计算机系列
class OfficeComputerFactory(ComputerFactory):
    def __init__(self):
        self.desktop = None
        self.laptop = None

    def create_desktop(self) -> Computer:
        self.desktop = OfficeDesktop()
        return self.desktop

    def create_laptop(self) -> Computer:
        self.laptop = OfficeLaptop()
        return self.laptop

    def assemble_computers(self):
        if self.desktop and self.laptop:
            print("组装办公计算机系列:")
            self.desktop.assemble()
            self.laptop.assemble()
        else:
            print("请先创建所有计算机。")


# 游戏计算机工厂,生产游戏计算机系列
class GamingComputerFactory(ComputerFactory):
    def __init__(self):
        self.desktop = None
        self.laptop = None

    def create_desktop(self) -> Computer:
        self.desktop = GamingDesktop()
        return self.desktop

    def create_laptop(self) -> Computer:
        self.laptop = GamingLaptop()
        return self.laptop

    def assemble_computers(self):
        if self.desktop and self.laptop:
            print("组装游戏计算机系列:")
            self.desktop.assemble()
            self.laptop.assemble()
        else:
            print("请先创建所有计算机。")


# 演示工厂模式和抽象工厂模式的使用
def main():
    # 工厂模式示例
    sedan_factory = SedanFactory()
    sedan = sedan_factory.create_vehicle()
    sedan.drive()  # 输出: 驾驶轿车

    suv_factory = SUVFactory()
    suv = suv_factory.create_vehicle()
    suv.drive()  # 输出: 驾驶SUV

    # 抽象工厂模式示例
    # 办公计算机系列示例
    office_factory = OfficeComputerFactory()
    office_factory.create_desktop()  # 创建办公台式机
    office_factory.create_laptop()  # 创建办公笔记本
    office_factory.assemble_computers()  # 输出: 组装办公计算机系列:组装办公台式机,组装办公笔记本

    # 游戏计算机系列示例
    gaming_factory = GamingComputerFactory()
    gaming_factory.create_desktop()  # 创建游戏台式机
    gaming_factory.create_laptop()  # 创建游戏笔记本
    gaming_factory.assemble_computers()  # 输出: 组装游戏计算机系列:组装游戏台式机,组装游戏笔记本


if __name__ == "__main__":
    main()

代码详细介绍

  1. 工厂模式

    • Vehicle:定义了车辆的抽象接口,包含一个抽象方法 drive,每种具体车辆都需要实现该方法。
    • Sedan 和 SUV:这两个类分别实现了 Vehicle 接口,定义了各自的 drive 方法,输出不同的驾驶信息。
    • VehicleFactory:定义了一个工厂接口,声明了 create_vehicle 方法,所有具体工厂都需要实现这个方法。
    • SedanFactory 和 SUVFactory:分别实现了 VehicleFactory 接口,用于创建 SedanSUV 实例。
  2. 抽象工厂模式

    • Computer:定义了计算机的抽象接口,包含一个抽象方法 assemble,具体计算机类需要实现此方法。
    • OfficeDesktop 和 OfficeLaptop:实现了 Computer 接口,分别用于组装办公台式机和笔记本。
    • GamingDesktop 和 GamingLaptop:实现了 Computer 接口,分别用于组装游戏台式机和笔记本。
    • ComputerFactory:抽象工厂接口,定义了创建台式机和笔记本的方法,以及协调工作的 assemble_computers 方法。
    • **Office

ComputerFactory 和 GamingComputerFactory**:具体工厂,分别用于创建办公和游戏系列的计算机,并实现了 assemble_computers 方法,确保所有计算机可以一起组装。

这个案例清晰地展示了工厂模式和抽象工厂模式的实现及应用,能够帮助我们更好地理解这两种设计模式的使用场景和优势。

图示

Image___1397757895814633604===f2c9495ab799490a4014a7cf89f3f017===3_1.png___

去1:1私密咨询

系列课程: