当前位置: 首页 > news >正文

抽象工厂

. 抽象工厂模式 (Abstract Factory)

代码示例:跨平台 UI 组件库

假设我们要开发一个 UI 库,支持 WindowsMac 两种风格。

  • 每种风格都有配套的:按钮 (Button)复选框 (Checkbox)
  • 规则: Windows 的按钮必须搭配 Windows 的复选框,绝对不能混搭(防止风格不统一)。
#include <iostream>
#include <string>
using namespace std;// ==========================================
// 1. 抽象产品族 (Abstract Products)
// 稳定点:无论哪个系统,都有按钮和复选框
// ==========================================class IButton {
public:virtual ~IButton() {}virtual void Click() = 0;
};class ICheckbox {
public:virtual ~ICheckbox() {}virtual void Check() = 0;
};// ==========================================
// 2. 具体产品 (Concrete Products)
// 变化点:不同系统的具体实现
// ==========================================// --- Windows 系列 ---
class WinButton : public IButton {
public:void Click() override { cout << "  [Win] 绘制方形按钮" << endl; }
};
class WinCheckbox : public ICheckbox {
public:void Check() override { cout << "  [Win] 绘制方框打钩" << endl; }
};// --- Mac 系列 ---
class MacButton : public IButton {
public:void Click() override { cout << "  [Mac] 绘制圆角按钮" << endl; }
};
class MacCheckbox : public ICheckbox {
public:void Check() override { cout << "  [Mac] 绘制圆形选中" << endl; }
};// ==========================================
// 3. 抽象工厂 (Abstract Factory)
// 稳定点:工厂必须能生产“一套”组件
// 核心区别:工厂方法只有一个 Create,这里有多个 Create
// ==========================================
class IGUIFactory {
public:virtual ~IGUIFactory() {}virtual IButton* CreateButton() = 0;virtual ICheckbox* CreateCheckbox() = 0;
};// ==========================================
// 4. 具体工厂 (Concrete Factories)
// 变化点:每个工厂负责生产“一个系列”
// ==========================================class WinFactory : public IGUIFactory {
public:IButton* CreateButton() override { return new WinButton(); }ICheckbox* CreateCheckbox() override { return new WinCheckbox(); }
};class MacFactory : public IGUIFactory {
public:IButton* CreateButton() override { return new MacButton(); }ICheckbox* CreateCheckbox() override { return new MacCheckbox(); }
};// ==========================================
// 客户端代码 (Client)
// ==========================================// 业务逻辑:渲染一个表单
// 关键:它只知道 IGUIFactory,完全不知道是 Windows 还是 Mac
void RenderForm(IGUIFactory* factory) {cout << "--- 开始渲染表单 ---" << endl;IButton* btn = factory->CreateButton();ICheckbox* box = factory->CreateCheckbox();btn->Click();box->Check();// 确保了 btn 和 box 是一家的,不会出现 WinButton 配 MacCheckboxdelete btn;delete box;
}int main() {cout << "=== 用户配置:使用 Windows 主题 ===" << endl;IGUIFactory* winFactory = new WinFactory();RenderForm(winFactory);delete winFactory;cout << "\n=== 用户配置:使用 Mac 主题 ===" << endl;IGUIFactory* macFactory = new MacFactory();RenderForm(macFactory);delete macFactory;return 0;
}

1. 定义

  • 原文: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 解读:
    • “一系列相关对象”:这就是产品族。比如上面的 WinButtonWinCheckbox 就是一家人。
    • “无需指定具体类”:客户端只管找工厂要 Button,工厂会保证给你的是配套的那一款。

2. 解决的问题 (Stable vs. Changing)

这里解决的是“多维度对象组合”的问题。

  • 稳定点 (Stable):产品的种类
    • UI 界面一定有按钮、文本框、复选框。这几样东西是不变的。
  • 变化点 (Changing):产品的风格系列
    • 可能是 Windows 风格,可能是 Mac 风格,也可能是 Linux 风格。

3. 与工厂方法模式的区别 (核心!)

这是一个常见的面试题,请务必区分:

  • 工厂方法模式 (Factory Method):
    • 关注点: 生产一个产品。
    • 维度: 一维。
    • 例子: Logger 工厂,只生产 Logger
  • 抽象工厂模式 (Abstract Factory):
    • 关注点: 生产一系列(配套)产品。
    • 维度: 二维(产品种类 x 风格系列)。
    • 例子: GUI 工厂,既生产 Button 又生产 Checkbox

4. 符合哪些设计原则?

  • A. 依赖倒置原则 (DIP)
    • 客户端只依赖 IButton, IGUIFactory 等抽象接口。
  • B. 开闭原则 (OCP) —— 有条件的符合
    • 对于“增加新系列”是开放的: 如果你要加一个 Linux 风格,只需要加 LinuxButton, LinuxCheckbox, LinuxFactory不需要修改现有代码
    • 对于“增加新产品”是关闭的(这是一个缺点): 如果你要在 GUI 里加一个“进度条 (Slider)”,你需要修改 IGUIFactory 接口(加 CreateSlider),然后所有的具体工厂(WinFactory, MacFactory)全都要改。

5. 什么时候用?

当你需要强行约束“对象必须配套使用”的时候。

  • 例如:
    • 游戏开发: 换皮肤。一套皮肤里包含(角色模型、武器模型、特效音效)。你不能穿“关羽”的衣服,拿“孙悟空”的棒子。
    • 数据库切换: 如果你的系统支持 MySQL 和 Oracle。Connection, Command, Cursor 这三个对象必须全是 MySQL 的,不能混用。
http://www.jsqmd.com/news/115825/

相关文章:

  • 对比:字节DeerFlow与阿里DeepResearch
  • 电路板维修
  • 设计模式的概念
  • 【后端开发笔记】JVM底层原理-垃圾回收篇 - 指南
  • 备份恢复模块 - Cordova与OpenHarmony混合开发实战
  • 第2章 变量和基本类型
  • 基于记忆增强网络的语言模型推理优化
  • 对比:Qwen-VL与传统的CNN在图像处理应用
  • 线程五种状态
  • 导入导出模块 - Cordova与OpenHarmony混合开发实战
  • 【硬件设计】DC12V输入的防护+滤波设计
  • 洞察:阿里通义DeepResearch 技术
  • 年前“催婚大作战”,用“技术思维”解决婚恋问题
  • 160. 相交链表
  • insert/update 注入
  • Matlab BP分类 设计神经网络 输入层,隐含层,输出层 可以应用于故障诊断 故障分类
  • 数据采集个人博客——途知旅行助手路径规划算法选择与api调用实现
  • 红黑树
  • 账户增删改查与余额统计 Cordova 与 OpenHarmony 混合开发实战
  • 推荐分享 - Cordova 与 OpenHarmony 混合开发实战
  • 【少走弯路】上海进出口权办理流程及费用?出口经营权的申请步骤? - 速递信息
  • 分类管理与分类统计 UI -Cordova 与 OpenHarmony 混合开发实战
  • 智能建议模块 Cordova 与 OpenHarmony 混合开发实战
  • 毕业季必看:8款AI写论文工具,5分钟生成万字问卷论文,自动生成高信度数据! - 麟书学长
  • 原型模式-创建型
  • 基于三电平SVPWM改进技术的异步电机感应电机直接转矩控制性能研究参考文献参考研究及其优劣对比
  • AI也会“三思而后答“?揭秘Self-RAG智能检索术
  • 智能决策系统日志系统设计:AI架构师的调试与分析技巧
  • 评论笔记 - Cordova 与 OpenHarmony 混合开发实战
  • epoll