新闻中心

C++怎么实现一个原型模式_C++通过复制现有实例来创建新对象的设计模式

2025-11-24
浏览次数:
返回列表
原型模式通过克隆现有对象创建新对象,避免复杂构造。定义抽象基类Prototype,声明纯虚clone方法;具体类如ConcretePrototype实现clone,返回自身副本;可选PrototypeManager管理原型实例,按名创建对象。

c++怎么实现一个原型模式_c++通过复制现有实例来创建新对象的设计模式

原型模式是一种创建型设计模式,它通过复制已有的实例来创建新的对象,而不是通过 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 PictoGraphic

AI驱动的矢量插图库和插图生成平台

PictoGraphic 133 查看详情 PictoGraphic 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官方平台访问  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画 

搜索