新闻中心

c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法

2025-10-29
浏览次数:
返回列表
工厂模式通过解耦对象创建提升代码灵活性,C++中可用基类指针与多态实现:1. 简单工厂根据参数创建具体产品;2. 工厂方法将创建延迟到子类;3. 抽象工厂用于创建相关对象族;4. 结合智能指针优化内存管理,避免泄漏。

c++如何实现工厂模式_c++工厂(factory)设计模式实现方法

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在C++中,通过基类指针和多态机制可以很好地实现工厂模式,使程序更灵活、易于扩展。

1. 简单工厂模式(Simple Factory)

简单工厂不是严格意义上的设计模式,但它是理解工厂概念的良好起点。它通过一个工厂类根据传入的参数决定创建哪一种具体产品。

假设我们有一个图形绘制程序,需要创建不同的图形对象:

// 图形基类
class Shape {
public:
    virtual void draw() = 0;
    virtual ~Shape() {}
};

// 具体图形类
class Circle : public Shape {
public:
    void draw() override {
        // 绘制圆形
    }
};

class Rectangle : public Shape {
public:
    void draw() override {
        // 绘制矩形
    }
};

// 工厂类
class ShapeFactory {
public:
    enum ShapeType { CIRCLE, RECTANGLE };

    static Shape* createShape(ShapeType type) {
        switch (type) {
            case CIRCLE:
                return new Circle();
            case RECTANGLE:
                return new Rectangle();
            default:
                return nullptr;
        }
    }
};

使用方式:

Shape* shape = ShapeFactory::createShape(ShapeFactory::CIRCLE);
shape->draw();
delete shape;

2. 工厂方法模式(Factory Method)

工厂方法模式将对象的创建延迟到子类。每个具体工厂负责创建对应的具体产品,符合开闭原则。

定义抽象工厂接口:

class ShapeFactory {
public:
    virtual Shape* createShape() = 0;
    virtual ~ShapeFactory() = default;
};

// 具体工厂
class CircleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Circle();
    }
};

class RectangleFactory : public ShapeFactory {
public:
    Shape* createShape() override {
        return new Rectangle();
    }
};

客户端代码:

XmxCms企业网站管理系统2.0 XmxCms企业网站管理系统2.0

原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可

XmxCms企业网站管理系统2.0 0 查看详情 XmxCms企业网站管理系统2.0 ShapeFactory* factory = new CircleFactory();
Shape* shape = factory->createShape();
shape->draw();
delete shape;
delete factory;

3. 抽象工厂模式(Abstract Factory)

当需要创建一组相关或依赖对象时,使用抽象工厂。例如,不同主题下的按钮和文本框。

// 按钮基类
class Button {
public:
    virtual void click() = 0;
    virtual ~Button() {}
};

class WinButton : public Button {
public:
    void click() override { / Windows风格点击 / }
};

// 文本框基类
class TextBox {
public:
    virtual void display() = 0;
    virtual ~TextBox() {}
};

class WinTextBox : public TextBox {
public:
    void display() override { / Windows风格显示 / }
};

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

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

    TextBox* createTextBox() override {
        return new WinTextBox();
    }
};

4. 使用智能指针优化内存管理

上面的例子使用了裸指针和手动 delete,容易出错。推荐使用智能指针避免内存泄漏。

修改返回类型为 std::unique_ptr:

#include

using ShapePtr = std::unique_ptr;

class ShapeFactory {
public:
    virtual ShapePtr createShape() = 0;
    virtual ~ShapeFactory() = default;
};

class CircleFactory : public ShapeFactory {
public:
    ShapePtr createShape() override {
        return std::make_unique();
    }
};

调用时无需手动释放资源,RAII 自动处理。

基本上就这些。工厂模式能有效分离对象创建与使用,提升代码可维护性。实际项目中结合配置或注册机制还能实现动态加载。

以上就是c++++如何实现工厂模式_c++工厂(Factory)设计模式实现方法的详细内容,更多请关注其它相关文章!


# 自定义  # 石家庄品牌推广营销平台  # 清远短视频seo  # 柳城可靠的网站建设工具  # 韶关网站推广推荐  # seo2和酮  # 简述网站建设方式有哪些  # 莱阳网络推广营销  # 增城企业网站优化推广  # 陕西冷链系统网站建设  # 深圳seo外推  # 运算符  # 文本框  # 如何选择  # c++  # 数据结构  # 如何实现  # 多态  # 企业网站  # 子类  # 管理系统  # 简单工厂模式  # win  # switch  # ai  # windows  # 工厂模式 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  在WordPress中通过REST API获取BasicAuth保护的远程文章  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  Promise错误处理:在catch后终止链式then执行的策略  c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发  怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  探索高级语言到C/C++的转译路径:以Go为例及内存管理策略  J*a 递归快速排序中静态变量的状态管理与陷阱  c++ 获取系统当前时间 c++时间戳获取方法  AO3网页版合集入口 Archive of Our Own同人作品浏览指南  在J*a中如何在J*a中使用异常机制记录错误日志_异常日志实践经验  css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容  J*aScript数据结构转换:将对象数组按类别分组  c++ dfs和bfs代码 c++深度广度优先搜索算法  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  火锅吃太多会怎样 火锅吃太多会上火吗  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  修复二维数组索引越界异常:一维循环到二维坐标的正确映射  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  内存疯狂猛猛涨价:主板销量直接腰斩!  《马克思佩恩3》早期版本曝光 UI设计曾多次调整!  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  HTML空白字符处理机制:渲染、DOM与编码实践  在React函数组件中利用原生HTML5进行邮箱地址验证  绝地鸭卫平a核爆刀流玩法攻略  天眼查企业查询官网入口 天眼查官方网页版查询  b站怎么取消点赞_b站点赞取消操作方法  Django模型中自动计算可用余额的实现方法  快速CSGO开箱网站指南 CSGO开箱平台推荐  c++如何使用chrono库处理时间_c++标准库时间与日期操作  J*a递归快速排序中静态变量导致数据累积问题的解决方案  必由学官网快捷入口 必由学网页版在线学习平台  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  在J*a中如何捕获IndexOutOfBoundsException_索引越界异常防护方法说明  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  Python自定义类排序:解决lambda键值访问TypeError的实践指南  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  曝R星经典之作开发图 设计简陋但信息密集!  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  b站如何看历史记录_b站观看历史找回方法  解决Bootstrap卡片顶部边距导致背景图下移的问题 

搜索