抽象工厂模式详解

ops/2025/1/3 4:48:10/

抽象工厂模式(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.  创建跨平台应用时,生成不同操作系统的程序。
抽象工厂模式通过提供一个接口来创建一系列相关或相互依赖的对象,使得客户端代码更加灵活,并且能够轻松地切换不同的产品族,而不需要修改现有的代码。


http://www.ppmy.cn/ops/146410.html

相关文章

【大语言模型】DeepSeek与Kimi对论文内容理解的简单对比

【大语言模型】DeepSeek与Kimi对论文内容理解的简单对比 目录 文章目录 【大语言模型】DeepSeek与Kimi对论文内容理解的简单对比目录1. 前言技术方向产品形态用户市场未来潜力 2. DeepSeek文章标题摘要创新点算法模型实验效果总结推荐阅读指数 3. Kimi文章标题摘要创新点算法模…

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…

Ubuntu网络配置(桥接模式, nat模式, host主机模式)

windows上安装了vmware虚拟机, vmware虚拟机上运行着ubuntu系统。windows与虚拟机可以通过三种方式进行通信。分别是桥接模式;nat模式;host模式 一、桥接模式 所谓桥接模式,也就是虚拟机与宿主机处于同一个网段, 宿主机…

Android 学习小记1

目录 先介绍一下Android Studio 看看常见的模板 1. No Activity 2. Empty Activity 3. Gemini API Starter 4. Basic View Activity 5. Bottom Navigation Activity 6. Empty Views Activity 7. Navigation Drawer Views Activity 8. Responsive Views Activity 9. G…

Hutool 发送 HTTP 请求的几种常见写法

最简单的 GET 请求: String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求: // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…

c++---------------------------string

从今天开始我们就开始学c的容器了就不需要我们造轮子了 1.为什么学习string类 1.1c语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列 的库函数,但是这些库函数与字符…

Android笔试面试题AI答之Android基础(5)

Android入门请看《Android应用开发项目式教程》 文章目录 1.Android最新的系统架构和早期架构有什么区别?**1. 应用开发语言****2. UI 开发方式****3. 架构组件****4. 数据绑定****5. 后台任务管理****6. 安全性****7. 性能优化****8. 跨平台支持****9. 新兴技术集…

雷电模拟器安装LSPosed

雷电模拟器最新版支持LSPosed。记录一下安装过程 首先到官网下载并安装最新版,我安装的时候最新版是9.1.34.0,64位 然后开启root和系统文件读写 然后下载magisk-delta-6并安装 ,这个是吾爱破解论坛提供的,号称适配安卓7以上所有机型&#x…