新闻中心
c++如何实现工厂模式_c++工厂(Factory)设计模式实现方法
工厂模式通过解耦对象创建提升代码灵活性,C++中可用基类指针与多态实现:1. 简单工厂根据参数创建具体产品;2. 工厂方法将创建延迟到子类;3. 抽象工厂用于创建相关对象族;4. 结合智能指针优化内存管理,避免泄漏。

工厂模式是一种创建型设计模式,用来解耦对象的创建过程。在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 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可
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:
#includeusing 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卡片顶部边距导致背景图下移的问题


2025-10-29
浏览次数:次
返回列表