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

【C++设计模式 – 工厂(Factory)模式】—— 对象创建的优雅解耦方案

【C++设计模式 – 工厂(Factory)模式】—— 对象创建的优雅解耦方案

工厂模式

什么是工厂模式?

工厂模式是一种创建型设计模式,其核心目标是将对象的实例化过程从使用对象的代码中解耦,通过统一接口实现对象的动态创建。该模式适用于需要根据不同条件生成不同类对象的场景,使系统更符合“开闭原则”(对扩展开放,对修改关闭)。

工厂模式的特点

封装创建过程:将对象的创建逻辑集中在工厂类中,避免业务代码与具体类耦合。多态性支持:通过接口或基类定义产品对象,允许灵活替换具体实现。扩展性强:新增产品类型时无需修改客户端代码,只需扩展工厂即可。标准化生产:所有产品遵循统一接口,确保使用一致性。

为何选择工厂模式?

降低耦合性:客户端无需关注对象创建细节,只需通过接口使用。集中管控:统一管理对象的创建逻辑,便于维护和权限控制(如资源复用)。灵活扩展:新增产品时只需新增工厂类或方法,无需改动已有代码。条件分支优化:替代代码中复杂的if-else或switch条件判断,提升可读性。

工厂模式的不足

类数量膨胀:每增加一个产品可能需要新增工厂类,增加代码复杂度。理解成本:需设计合理的继承层次,过度设计可能影响开发效率。抽象限制:产品必须基于同一接口,若差异过大可能难以抽象。

工厂模式的实现

  1. 简单工厂模式(非严格设计模式)
    通过单一工厂类根据参数返回不同产品实例。
#include <iostream>

// 抽象产品类
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() = default;
};

// 具体产品:圆形
class Circle : public Shape {
public:
    void draw() override { std::cout << "Drawing Circle\n"; }
};

// 具体产品:矩形
class Rectangle : public Shape {
public:
    void draw() override { std::cout << "Drawing Rectangle\n"; }
};

// 简单工厂
class ShapeFactory {
public:
    static Shape* createShape(const std::string& type) {
        if (type == "Circle") return new Circle();
        if (type == "Rectangle") return new Rectangle();
        return nullptr; 
    }
};

int main() {
    Shape* circle = ShapeFactory::createShape("Circle");
    Shape* rect = ShapeFactory::createShape("Rectangle");

    circle->draw(); // "Drawing Circle"
    rect->draw();   // "Drawing Rectangle"

    delete circle, delete rect;
    return 0;
}

**特点:**实现简单但违反开闭原则(新增类型需修改工厂逻辑)。

  1. 工厂方法模式(Factory Method)
    定义抽象工厂接口,由子类决定实例化哪个类。
#include <iostream>

// 抽象产品
class Button {
public:
    virtual void render() = 0;
    virtual ~Button() = default;
};

// 具体产品:Windows按钮
class WinButton : public Button {
public:
    void render() override { std::cout << "Windows Style Button\n"; }
};

// 具体产品:Mac按钮
class MacButton : public Button {
public:
    void render() override { std::cout << "MacOS Style Button\n"; }
};

// 抽象工厂
class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual ~GUIFactory() = default;
};

// 具体工厂:Windows风格
class WinFactory : public GUIFactory {
public:
    Button* createButton() override { return new WinButton(); }
};

// 具体工厂:Mac风格
class MacFactory : public GUIFactory {
public:
    Button* createButton() override { return new MacButton(); }
};

// 客户端代码
void Application(GUIFactory& factory) {
    Button* btn = factory.createButton();
    btn->render();
    delete btn;
}

int main() {
    WinFactory win;
    MacFactory mac;

    Application(win); // 输出:Windows Style Button
    Application(mac); // 输出:MacOS Style Button

    return 0;
}

**优势:**遵循开闭原则,新增产品无需修改现有工厂。

  1. 抽象工厂模式(Abstract Factory)
    用于创建产品族(多组相关对象),确保产品间的兼容性。
#include <iostream>

// 抽象产品:按钮
class Button { /* 同工厂方法示例 */ };

// 抽象产品:文本框
class TextBox {
public:
    virtual void input() = 0;
    virtual ~TextBox() = default;
};

// Windows组件
class WinButton : public Button { /* ... */ };
class WinTextBox : public TextBox {
public:
    void input() override { std::cout << "Windows TextBox\n"; }
};

// Mac组件
class MacButton : public Button { /* ... */ };
class MacTextBox : public TextBox {
public:
    void input() override { std::cout << "MacOS TextBox\n"; }
};

// 抽象工厂接口
class GUIFactory {
public:
    virtual Button* createButton() = 0;
    virtual TextBox* createTextBox() = 0;
    virtual ~GUIFactory() = default;
};

// 具体工厂实现
class WinFactory : public GUIFactory {
public:
    Button* createButton() override { return new WinButton(); }
    TextBox* createTextBox() override { return new WinTextBox(); }
};

class MacFactory : public GUIFactory {
public:
    Button* createButton() override { return new MacButton(); }
    TextBox* createTextBox() override { return new MacTextBox(); }
};

// 使用示例
void CreateUI(GUIFactory& factory) {
    Button* btn = factory.createButton();
    TextBox* tb = factory.createTextBox();
    btn->render();
    tb->input();
    delete btn, delete tb;
}

int main() {
    WinFactory winFac;
    MacFactory macFac;

    CreateUI(winFac); // 输出Windows系列组件
    CreateUI(macFac); // 输出Mac系列组件

    return 0;
}

适用场景:需要确保多个关联产品协同工作(如跨平台UI组件)。

工厂模式的选择策略

模式类型适用场景复杂度
简单工厂产品类型固定且数量较少
工厂方法需要支持新产品的灵活添加
抽象工厂需创建一组高度关联的复杂对象

总结:

工厂模式通过封装对象创建逻辑,显著提升了代码的可维护性和可扩展性。虽然在简单场景可能略显复杂,但其在大型项目或框架设计中能有效降低模块间的耦合度,是面向对象设计中不可或缺的利器。

相关文章:

  • Linux面试题
  • Bom详解和Dom详解
  • 本地使用docker部署DeepSeek大模型
  • 【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库
  • Java全栈项目-田径运动会管理系统
  • 23种设计模式 - 责任链
  • 存储结构 分类
  • 使用Swupdate恢复模式更新嵌入式linux系统
  • 大师课程:穿越日本专业级人文风景摄影视频课程 Fstoppers - Photographing the World 6 - Japan II
  • 基于微信小程序的宠物寄养平台的设计与实现(ssm论文源码调试讲解)
  • FPGA VIVADO:axi-lite 从机和主机
  • 环境变量 PATH 与可执行文件识别机制详解
  • 数据倾斜定义以及在Spark中如何处理数据倾斜问题
  • 14. Docker 轻量级可视化工具 Portainer(的详细安装步骤+常规使用详细说明)
  • PyQt加载UI文件
  • x86平台基于Qt+opengl优化ffmpeg软解码1080P视频渲染效率
  • 【GoLang】【算法模板】2、GoLang 算法模板整理
  • Java包装类泛型编程
  • Sa-Token 根据官方文档简单实现登录认证的示例
  • 认识 ADB(Android Debug Bridge,Android SDK 中的一个工具)
  • 著名植物学家、园艺学家,国际植物园协会原主席贺善安逝世
  • 北京“准80后”干部兰天跨省份调任新疆生态环境厅副厅长
  • 男子退机票被收90%的手续费,律师:虽然合规,但显失公平
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱
  • 五粮液董事长:茅台1935已脱离千元价位带,五粮液在千元价位已逐步摆脱其他竞品纠缠
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理