新闻中心
C++如何实现一个原型模式_C++设计模式之通过克隆创建新对象
原型模式通过克隆现有对象创建新对象,避免使用new关键字。1. 核心思想是利用虚函数clone()实现多态复制,支持运行时动态创建未知类型对象;2. 实现方式为定义抽象基类Shape,派生类如Circle和Rectangle重写clone()返回自身堆上拷贝,结合智能指针管理内存;3. 可引入PrototypeFactory注册原型并批量生成对象,提升配置化创建效率;4. 需注意深拷贝、性能及适用场景,确保资源安全与正确性。

原型模式是一种创建型设计模式,它通过复制已有对象来创建新对象,而不是通过 new 关键字重新构造。在 C++ 中实现原型模式,关键是让类具备“克隆”自己的能力,通常通过定义一个虚函数 clone() 来完成。
1. 原型模式的核心思想
当你有一个对象实例,并希望基于它创建一个完全相同的副本时,直接拷贝可能不够灵活,尤其是涉及多态或复杂继承结构时。原型模式允许你在运行时动态创建对象,无需知道其具体类型。
实现的关键点包括:
- 定义一个抽象基类,包含纯虚的 clone() 函数
- 每个派生类实现自己的 clone() 方法,返回自身类型的堆上拷贝
- 使用 clone() 而不是构造函数来创建新对象
2. 基本实现方式
以下是一个简单的 C++ 示例,展示如何用原型模式克隆不同类型的图形对象:
#include <iostream>
#include <memory>
class Shape {
public:
virtual ~Shape() = default;
virtual std::unique_ptr<Shape> clone() const = 0;
virtual void draw() const = 0;
};
class Circle : public Shape {
public:
Circle(int radius = 1) : m_radius(radius) {}
std::unique_ptr<Shape> clone() const override {
return std::make_unique<Circle>(*this); // 拷贝构造
}
void draw() const override {
std::cout << "Drawing a circle with radius " << m_radius << "\n";
}
private:
int m_radius;
};
class Rectangle : public Shape {
public:
Rectangle(int w = 1, int h = 1) : m_width(w), m_height(h) {}
std::unique_ptr<Shape> clone() const override {
return std::make_unique<Rectangle>(*this);
}
void draw() const override {
std::cout << "Drawing a rectangle " << m_width << "x" << m_height << "\n";
}
private:
int m_width, m_height;
};
上面代码中,每个具体类都实现了 clone(),利用拷贝构造函数在堆上创建新实例。std::unique_ptr 确保了内存安全和所有权清晰。
3. 使用原型工厂管理克隆
为了更方便地使用原型模式,可以引入一个“原型注册表”,即原型工厂:
Lateral App
整理归类论文
85
查看详情
class PrototypeFactory {
public:
void set_prototype(std::unique_ptr<Shape> prototype) {
m_prototype = std::move(prototype);
}
std::unique_ptr<Shape> create() const {
if (m_prototype)
return m_prototype->clone
();
return nullptr;
}
private:
std::unique_ptr<Shape> m_prototype;
};
使用示例:
int main() {
PrototypeFactory factory;
factory.set_prototype(std::make_unique<Circle>(5));
auto shape1 = factory.create();
auto shape2 = factory.create();
shape1->draw(); // Drawing a circle with radius 5
shape2->draw(); // Same
return 0;
}
这样,你只需维护一个原型实例,就能反复生成相同配置的对象,特别适合配置化对象创建场景。
4. 注意事项与适用场景
原型模式不是万能的,需注意以下几点:
- 深拷贝 vs 浅拷贝:如果对象包含指针成员,clone() 必须实现深拷贝,否则会出现重复释放问题
- 性能考量:克隆可能比构造函数慢,但避免了复杂初始化逻辑
- 适用场景:对象创建成本高、配置复杂、或运行时动态决定类型时最有效
基本上就这些。C++ 中通过虚函数 + 克隆机制实现原型模式,结构清晰,配合智能指针可写出安全高效的代码。不复杂但容易忽略细节,比如拷贝构造的支持和资源管理。
以上就是C++如何实现一个原型模式_C++设计模式之通过克隆创建新对象的详细内容,更多请关注其它相关文章!
# 而不是
# 衡阳专业网站建设联系人
# 桔子seo网
# 每日seo表格
# 北京谷歌关键词排名
# 容桂网站推广方案
# seo培训去哪里
# 商丘ai网站推广优化
# 太原做网站建设赚钱吗
# 象山营销推广
# SEO机器刷排名
# 边缘
# 是一个
# ai
# 需注意
# 尼克
# 如何实现
# 多态
# 自己的
# 游戏开发
# stream
# win
# 注册表
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
内存疯狂猛猛涨价:主板销量直接腰斩!
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
Node.js 中使用 node-cron 实现定时 API 数据抓取与处理
京东单号查询入口_京东快递订单追踪入口
如何在Promise链中有效终止错误处理后的执行
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
韩剧圈正版入口页面_韩剧圈官网登录链接
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
Python字典中优雅地迭代剩余元素的方法
最新韩小圈网页版登录入口_官网在线观看官方链接
海棠电脑版入口_通过电脑访问海棠官网阅读
在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全
mcjs网页版在线存档 mcjs云存档登录入口
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
在Go Martini框架中高效服务动态生成图像的实践指南
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
Golang如何实现简单的Web表单_Golang表单提交与验证处理方法
Angular Material 垂直步进器:实现底部到顶部排序的教程
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
2026春节假期票务安排_2026春节放假购票指南
AO3同人作品网入口 AO3搜索引擎官网永久地址
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
composer的"require-dev"部分是用来做什么的?
优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率
Golang如何使用new_Go new分配内存机制讲解
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
浏览器打开即用 美图秀秀网页版入口
Mudbox图层蒙版怎么用_Mudbox图层蒙版数字雕刻应用技巧
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
mysql如何设置表访问权限_mysql表访问权限配置
Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
构建轻量级网站内部消息系统:Formspree 集成指南
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
淘宝网网页版登录入口 淘宝官方网页版快捷登录
如何将HTML表格多行数据保存到Google Sheet
outlook中文官网入口地址 outlook官方中文版直达首页链接
优化Django表单:提交验证失败后保留用户输入
C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
vivo云服务网页版登录 怎么登录vivo云服务网页版
C++如何生成随机数_C++ random库使用方法与范围设置
QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口
Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式
163邮箱登录密码 163邮箱忘记密码找回
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色


2025-12-05
浏览次数:次
返回列表
();
return nullptr;
}
private:
std::unique_ptr<Shape> m_prototype;
};