新闻中心
C++怎么实现一个原型模式_C++通过复制现有实例来创建新对象的设计模式
原型模式通过克隆现有对象创建新对象,避免复杂构造。定义抽象基类Prototype,声明纯虚clone方法;具体类如ConcretePrototype实现clone,返回自身副本;可选PrototypeManager管理原型实例,按名创建对象。

原型模式是一种创建型设计模式,它通过复制已有的实例来创建新的对象,而不是通过 new 关键字重新构造。在 C++ 中实现原型模式的关键是定义一个抽象接口,让具体类自己实现克隆方法,从而实现动态对象创建和避免复杂的构造过程。
定义原型接口
首先,定义一个抽象基类,声明一个纯虚的 clone 接口。所有可被复制的对象都继承这个接口。
class Prototype { public:virtual ~Prototype() = default; virtual Prototype* clone() const = 0; };实现具体原型类
每个具体类需要重写 clone 方法,返回自身的一个副本。这里可以使用拷贝构造函数来确保深拷贝或浅拷贝的正确性。
class ConcretePrototype : public Prototype { private:int value; std::string data;public: ConcretePrototype(int v, const std::string& d) : value(v), data(d) {}
<font color="#006400"><strong>// 实现克隆方法</strong></font>
Prototype* clone() <font color="#0000FF"><strong>const override</strong></font> {
<font color="#0000FF"><strong>return</strong></font> <font color="#0000FF"><strong&
gt;new</strong></font> ConcretePrototype(*<font color="#0000FF"><strong>this</strong></font>);
}
<font color="#0000FF"><strong>void</strong></font> show() <font color="#0000FF"><strong>const</strong></font> {
std::cout << "Value: " << value << ", Data: " << data << "\n";
}};
使用原型管理器(可选)
为了更方便地管理和创建原型对象,可以引入一个原型注册表,按名称存储和获取原型实例。
PictoGraphic
AI驱动的矢量插图库和插图生成平台
133
查看详情
class PrototypeManager {
private:
std::unordered_map<:string prototype> prototypes;
public:void addPrototype(const std::string& name, Prototype* proto) { if (prototypes.find(name) == prototypes.end()) { prototypes[name] = proto; } }
Prototype* create(<font color="#0000FF"><strong>const</strong></font> std::string& name) {
<font color="#0000FF"><strong>auto</strong></font> it = prototypes.find(name);
<font color="#0000FF"><strong>if</strong></font> (it != prototypes.end()) {
<font color="#0000FF"><strong>return</strong></font> it->second->clone();
}
<font color="#0000FF"><strong>return</strong></font> nullptr;
}
~PrototypeManager() {
<font color="#0000FF"><strong>for</strong></font> (<font color="#0000FF"><strong>auto</strong></font>& pair : prototypes) {
<font color="#0000FF"><strong>delete</strong></font> pair.second;
}
}};
示例用法
使用原型模式创建对象:
int main() { PrototypeManager manager; manager.addPrototype("example", new ConcretePrototype(42, "sample"));Prototype* obj1 = manager.create("example");
Prototype* obj2 = manager.create("example");
<font color="#0000FF"><strong>static_cast</strong></font><ConcretePrototype*>(obj1)->show(); <font color="#006400"><strong>// 输出相同内容</strong></font>
<font color="#0000FF"><strong>static_cast</strong></font><ConcretePrototype*>(obj2)->show();
<font color="#0000FF"><strong>delete</strong></font> obj1;
<font color="#0000FF"><strong>delete</strong></font> obj2;
<font color="#0000FF"><strong>return</strong></font> 0;}
基本上就这些。关键在于 clone 方法的实现要保证对象状态完整复制,注意深拷贝问题。如果成员包含指针或资源,需手动实现拷贝构造函数以避免浅拷贝带来的问题。
以上就是C++怎么实现一个原型模式_C++通过复制现有实例来创建新对象的设计模式的详细内容,更多请关注其它相关文章!
# 中文网
# 企业人才服务网站建设
# 怎么找公司做网站推广呢
# 哈尔滨seo搜索栏玩法
# 濮阳网站优化哪家专业
# 丽水seo优化价格
# 罗湖seo优化
# 宜春装修网站建设
# SEO没电话
# 福建车灯升级关键词排名
# 抖音seo美业
# 重写
# 解决问题
# c++原型模式
# 相关文章
# 是一种
# 头文件
# 如何使用
# 尼克
# 可选
# red
# 注册表
# c++
# ai
# 对象复制
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
CSS子选择器:如何区分并样式化嵌套列表的子层级
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
Angular Material 垂直步进器:实现底部到顶部排序的教程
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】
iCloud登录入口网页版 苹果iCloud官网登录
必由学官方平台入口 必由学在线课堂登录地址
QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口
Bing引擎入口最新2025 Bing搜索免费官方登录
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
抖音怎么赚钱_抖音创作者变现方法与途径指南
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
163邮箱官方主页登录 直达网易邮箱登录核心页面
Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
理解Python模块与全局变量的作用域管理
如何将HTML表格多行数据保存到Google Sheet
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
菜鸟取件码是什么怎么查 最全查询渠道汇总
Spyder启动失败:字体文件权限拒绝错误解决方案
AO3镜像入口大全 AO3网页版内容访问全集
深入理解Promise链:如何在catch后中断then的执行
树莓派传感器触发:通过Twilio API发送WhatsApp消息教程
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
Pandas DataFrame:高效添加条件计算列
小米14应用无法联网原因分析_小米14网络权限修复
VS Code远程开发时如何处理文件权限问题
抖音极速版最新版本 抖音极速版官方下载地址
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
Mac怎么使用表情符号_Mac Emoji快捷键面板
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
J*aScript数组对象转换:按指定键分组与值收集
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
内存检查:在VS Code中调试C++时的内存视图
AO3官方可用镜像 Archive of Our Own网页版最新入口
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
一加 Nord 5 隐私权限异常_一加 Nord 5 系统安全优化
《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元
电脑安装程序提示“错误1722”怎么办_Windows Installer服务问题解决【教程】
谷歌推RCS信息存档功能:公司可监控员工私密信息!
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
Go语言中JSON数据解码与字段访问指南
AO3最新镜像入口 Archive of Our Own官方平台访问
妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画


2025-11-24
浏览次数:次
返回列表
gt;new</strong></font> ConcretePrototype(*<font color="#0000FF"><strong>this</strong></font>);
}
<font color="#0000FF"><strong>void</strong></font> show() <font color="#0000FF"><strong>const</strong></font> {
std::cout << "Value: " << value << ", Data: " << data << "\n";
}