定义抽象产品类Product,包含纯虚函数use;2. 实现具体产品ConcreteProductA和ConcreteProductB;3. 创建工厂类Factory,通过createProduct方法根据参数返回不同产品实例,实现对象创建与使用的分离。
工厂模式是创建型设计模式中非常常见的一种,它的核心思想是将对象的创建过程封装起来,让调用者无需关心具体类的实例化细节。在C++中,通过基类指针、虚函数和多态机制,可以很好地实现这一模式。下面以一个简单的例子说明如何用C++实现工厂模式。
首先定义一个抽象基类(产品接口),所有具体产品都继承自它。这个类通常包含一个或多个虚函数,用于定义产品的公共行为。
class Product {
public:
virtual ~Product() = default;
virtual void use() const = 0;
};
比如我们有两个具体产品:ConcreteProductA 和 ConcreteProductB。
class ConcreteProductA : public Product {
public:
void use() const override {
std::cout << "Using Product A\n";
}
};
class ConcreteProductB : public Product {
public:
void use() const override {
std::cout << "Using Product B\n";
}
};
工厂类负责根据输入参数创建不同的产品对象。它对外提供一个创建接口,内部决定实例化哪一个具体类。
class Factory {
public:
Product* createProduct(const std::string& type) {
if (type == "A") {
return new ConcreteProductA();
} else if (type == "B") {
return new ConcreteProductB();
} else {
return nullptr;
}
}
};
使用示例:
int main() { Factory factory;
Product* product1 = factory.createProduct("A"); Product* product2 = factory.createProduct("B"); if (product1) { product1->use(); // 输出: Using Product A delete product1; } if (product2) { product2->use(); // 输出: Using Product B delete product2; } return 0;}
上面的例子中使用了 raw pointer 和 new/delete,容易造成内存管理问题。更现代的写法是返回智能指针。
#includeclass Factory { public: std::unique_ptr
createProduct(const std::string& type) { if (type == "A") { return std::make_unique (); } else if (type == "B") { return std::make_unique (); } else { return nullptr; } } };
调用方式也更安全:
auto product1 = factory.createProduct("A");
if (product1) product1->use();
如果产品种类很多,可以在运行时动态注册构造函数,避免修改工厂代码。可以用函数映射实现:
class Factory {
using Creator = std::function()>;
std::map creators;
public:
void registerProduct(const std::string& type, Creator creator) {
creators[type] = creator;
}
std::unique_ptrzuojiankuohaophpcnProductyoujiankuohaophpcn createProduct(const std::string& type) {
auto it = creators.find(type);
if (it != creators.end()) {
return it-youjiankuohaophpcnsecond();
}
return nullptr;
}};
// 使用时注册
Factory factory;
factory.registerProduct("A", [](){ return std::make_unique(); });
factory.registerProduct("B", [](){ return std::make_unique(); });
这种方式支持后期扩展,符合开闭原则。
总结:C++中的工厂模式通过多态和封装解耦了对象创建与使用。结合智能指针能写出既安全又灵活的代码。基本结构包括抽象产品、具体产品和工厂类。对于大型项目,可引入注册机制提升可维护性。
基本上就这些。
# c++
# 封装
# 多态
# 构造函数
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# pointer
# delete
# 对象
# 中非
# 这一
# 很好
# 多个
# 可以用
# 可选
# 提供一个
# 如何用
# 也更
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
C++ STL算法库怎么用?C++常用算法函数(sort, find)教程【效率提升】
LINUX下如何配置VLAN虚拟局域网_在LINUX交换机与服务器上的实现
如何有效拦截拼接式恶意域名的垃圾信息
网站体验不好=浪费钱:如何提升-用户体验效果差
手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】
mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】
Win11怎么设置开机密码_Windows11账户登录选项PIN码
用lighttpd能运行php吗_lighttpd配置php步骤【教程】
php做exe支持多线程吗_并发处理实现方式【详解】
php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】
VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】
Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】
短链接怎么用php递归还原_多层加密链接的处理法【详解】
如何解决Windows字体显示模糊的问题?(ClearType设置)
php485读数据时阻塞怎么办_php485非阻塞读取设置技巧【详解】
Python装饰器设计思路_功能增强机制说明【指导】
Win11怎么设置闹钟_Windows 11时钟应用闹钟设置指南【详解】
Win11相机打不开提示错误怎么修_相机权限开启与驱动修复【影像修复】
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
如何使用Golang反射创建map对象_动态生成键值映射
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
如何在包含多值的列中精准搜索指定演员?
c# 在高并发场景下,委托和接口调用的性能对比
Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】
php中$this和::能混用吗_对象与静态作用域冲突解决【方法】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
PHP主流架构怎么集成Redis缓存_配置步骤【方法】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
win11 OneDrive怎么彻底关闭 Win11禁用并卸载OneDrive教程【分享】
如何在Golang中实现WebSocket广播_使用Channel和协程分发消息
如何在 Go 中创建包含 map 的 slice(嵌套数据结构)
MAC怎么设置程序窗口永远最前_MAC窗口置顶插件安装与快捷设置【方法】
英国搜索:多数英国人认为语言搜索是未来搜索
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Win11怎么设置指纹解锁 Win11笔记本录入指纹登录【教程】
如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟
Go语言中slice追加操作的底层共享机制详解
Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】
Windows系统时间服务错误_W32Time服务修复与同步教学
C++友元类使用场景_C++类间协作设计方式讲解
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
如何使用Golang log设置日志输出格式_Golang log日志格式示例
Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】
Drupal 中 HTML 链接被重复转义导致渲染异常的解决方案
Mac如何解压zip和rar文件?(推荐免费工具)
如何在 Go 中正确初始化结构体中的 map 字段
Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】
2025-11-15
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。