抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式允许客户端使用抽象工厂接口来创建一族产品,而不必直接使用具体产品的实现类。
意图
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。
主要解决
接口选择的问题,确保同一产品族的对象一起工作,客户端不需要知道每个对象的具体类,简化了代码。
适用场景
当系统需要创建多个相关或依赖的对象,而不需要指定具体类时。
结构组成
抽象工厂模式包含以下几个主要角色:
1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4. 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
代码实现
以下是一个抽象工厂模式的Python代码示例:
from abc import ABC, abstractmethod
class AbstractFactory(ABC):
"""
The Abstract Factory interface declares a set of methods that return
different abstract products. These products are called a family and are
related by a high-level theme or concept.
"""
@abstractmethod
def create_product_a(self) -> 'AbstractProductA':
pass
@abstractmethod
def create_product_b(self) -> 'AbstractProductB':
pass
class ConcreteFactory1(AbstractFactory):
"""
Concrete Factories produce a family of products that belong to a single
variant. The factory guarantees that resulting products are compatible.
"""
def create_product_a(self) -> 'AbstractProductA':
return ConcreteProductA1()
def create_product_b(self) -> 'AbstractProductB':
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self) -> 'AbstractProductA':
return ConcreteProductA2()
def create_product_b(self) -> 'AbstractProductB':
return ConcreteProductB2()
class AbstractProductA(ABC):
"""
Each distinct product of a product family should have a base interface.
"""
@abstractmethod
def useful_function_a(self) -> str:
pass
class ConcreteProductA1(AbstractProductA):
def useful_function_a(self) -> str:
return "The result of the product A1."
class ConcreteProductA2(AbstractProductA):
def useful_function_a(self) -> str:
return "The result of the product A2."
class AbstractProductB(ABC):
@abstractmethod
def useful_function_b(self) -> str:
pass
class ConcreteProductB1(AbstractProductB):
def useful_function_b(self) -> str:
return "The result of the product B1."
class ConcreteProductB2(AbstractProductB):
def useful_function_b(self) -> str:
return "The result of the product B2."
在这个例子中,AbstractFactory 定义了创建产品的方法,ConcreteFactory1 和 ConcreteFactory2 是具体的工厂实现,它们分别创建属于它们各自变体的具体产品 ConcreteProductA1、ConcreteProductA2、ConcreteProductB1 和 ConcreteProductB2。
优点
1. 确保同一产品族的对象一起工作。
2. 客户端不需要知道每个对象的具体类,简化了代码。
缺点
扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
使用场景
1. QQ换皮肤时,整套皮肤一起更换。
2. 创建跨平台应用时,生成不同操作系统的程序。
抽象工厂模式通过提供一个接口来创建一系列相关或相互依赖的对象,使得客户端代码更加灵活,并且能够轻松地切换不同的产品族,而不需要修改现有的代码。