第3课设计模式_工厂_抽象工厂模式
热度🔥:66 免费课程
授课语音
工厂模式和抽象工厂模式
1. 介绍
工厂模式和抽象工厂模式是面向对象设计中常用的两种设计模式,旨在解耦对象的创建过程和使用过程,从而增强系统的灵活性和可维护性。
工厂模式
工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,由子类决定实例化哪个类。工厂模式将对象的实例化推迟到子类,从而提高了系统的灵活性。
应用场景:
- 需要大量创建对象的情况:当对象的创建过程复杂,或需要创建的对象可能发生变化时,使用工厂模式可以集中管理对象的创建。
- 类不知道需要的对象具体类:例如,某个操作系统的接口,但不确定具体实现的操作系统类型。
- 通过子类实例化满足需求:当类希望通过子类来决定具体对象的创建,以避免直接依赖具体实现类。
优点:
- 降低耦合度:客户端代码不需要知道创建对象的具体类,只需了解工厂方法。
- 增强灵活性:可以通过更改子类的实现方便地扩展系统。
- 集中控制对象的创建过程:统一管理对象的创建逻辑,易于维护和扩展。
缺点:
- 增加系统复杂度:需要创建多个工厂类,可能引入多个接口。
抽象工厂模式
抽象工厂模式也是一种创建型设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而不需要指定具体类。通过定义一个抽象工厂接口,允许子类实现该接口以生成相关对象。
应用场景:
- 需要创建一系列相关联的对象:例如创建一套用户界面的控件(按钮、对话框、文本框等)。
- 系统需要独立于对象的创建和组合过程:通过一组共同的接口来管理对象,与对象的具体实现解耦。
- 支持多种系列的对象创建:如支持不同风格的用户界面(Windows风格、Mac风格)时,抽象工厂模式能够有效管理这些不同系列的对象。
优点:
- 可以创建一系列相关的对象:通过统一接口创建一组相关对象,确保一致性和兼容性。
- 解耦具体产品实现:客户端代码不依赖于具体产品的实现,仅依赖于抽象接口。
- 增加系统扩展性:可以轻松增加新产品系列而无需修改现有代码。
缺点:
- 引入更多抽象层次:增加了系统的复杂度,需要处理更多的工厂类和接口。
- 产品族变化可能需更改代码:当产品族变化较大时,可能需要修改工厂实现代码。
总结比较
- 工厂模式侧重于提供创建单一产品对象的接口,主要用于解决具体对象的创建问题。
- 抽象工厂模式则更为全面,解决创建一系列相关产品对象的问题,适合需要多个对象协调工作的场景。
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()
代码详细介绍
工厂模式
- Vehicle:定义了车辆的抽象接口,包含一个抽象方法
drive
,每种具体车辆都需要实现该方法。 - Sedan 和 SUV:这两个类分别实现了
Vehicle
接口,定义了各自的drive
方法,输出不同的驾驶信息。 - VehicleFactory:定义了一个工厂接口,声明了
create_vehicle
方法,所有具体工厂都需要实现这个方法。 - SedanFactory 和 SUVFactory:分别实现了
VehicleFactory
接口,用于创建Sedan
和SUV
实例。
- Vehicle:定义了车辆的抽象接口,包含一个抽象方法
抽象工厂模式
- Computer:定义了计算机的抽象接口,包含一个抽象方法
assemble
,具体计算机类需要实现此方法。 - OfficeDesktop 和 OfficeLaptop:实现了
Computer
接口,分别用于组装办公台式机和笔记本。 - GamingDesktop 和 GamingLaptop:实现了
Computer
接口,分别用于组装游戏台式机和笔记本。 - ComputerFactory:抽象工厂接口,定义了创建台式机和笔记本的方法,以及协调工作的
assemble_computers
方法。 - **Office
- Computer:定义了计算机的抽象接口,包含一个抽象方法
ComputerFactory 和 GamingComputerFactory**:具体工厂,分别用于创建办公和游戏系列的计算机,并实现了 assemble_computers
方法,确保所有计算机可以一起组装。
这个案例清晰地展示了工厂模式和抽象工厂模式的实现及应用,能够帮助我们更好地理解这两种设计模式的使用场景和优势。