C++原型模式通过抽象基类声明clone()接口,具体类实现深拷贝逻辑,可选原型管理器按名注册与克隆,核心是对象自主克隆以解耦构造细节。
在 C++ 中实现原型模式,核心是让对象能“克隆自己”——通过定义一个统一的克隆接口,并由具体类自行实现深拷贝逻辑,从而避免紧耦合于构造细节,支持运行时动态创建类型未知的对象。
声明一个抽象基类(如 Prototype),提供纯虚函数 clone()。它不关心怎么复制,只约定“你能复制出一个新对象”。
注意:返回类型通常用智能指针(如 std::unique_ptr
示例:
class Prototype {
public:
virtual ~Prototype() = default;
virtual std::unique_ptr clone() const = 0;
};
每个可被克隆的具体类(如 ConcretePrototypeA)继承基类,重写 clone(),在其中调用自身构造函数或手动复制成员变量。
若含指针、容器、资源句柄等,必须做深拷贝;否则默认拷贝构造可能引发浅拷贝问题(如双释放、悬空指针)。
示例(含动态分配成员):
class ConcretePrototypeA : public Prototype {
private:
int value_;
std::string* data_; // 动态分配,需深拷贝
public:
ConcretePrototypeA(int v, const std::string& s)
: value(v), data(new std::string(s)) {}
// 深拷贝实现
std::unique_ptr clone() const override {
return st
d::make_unique(*this);
}
// 自定义拷贝构造(确保深拷贝 data_)
ConcretePrototypeA(const ConcretePrototypeA& other)
: value_(other.value_),
data_(other.data_ ? new std::string(*other.data_) : nullptr) {}
~ConcretePrototypeA() { delete data_; }
};
用一个简单注册表(如 std::map<:string std::unique_ptr>>)缓存原型实例,客户端通过字符串 ID 获取并克隆,解耦创建逻辑。
适用于需要按名动态生成多种类型的场景(如配置驱动的对象工厂)。
示例简版:
class PrototypeRegistry {
private:
std::map> prototypes_;
public:
void registerPrototype(const std::string& name, std::uniqueptr proto) {
prototypes [name] = std::move(proto);
}
std::unique_ptr create(const std::string& name) const {
auto it = prototypes_.find(name);
return (it != prototypes_.end()) ? it->second->clone() : nullptr;
}
};
// 使用:
PrototypeRegistry registry;
registry.registerPrototype("A", std::make_unique(42, "hello"));
auto obj = registry.create("A"); // 得到一份独立副本
原型模式不是万能的,C++ 实现中需特别留意:
clone() 会失效std::unique_ptr 或 std::shared_ptr 返回克隆结果,防止内存泄漏或误删clone() 声明为 const 成员函数,表示克隆不改变原对象状态原型模式在 C++ 中本质是“面向对象的拷贝抽象”,它把“怎么造一个新对象”的决策权交给对象自身,适合配置化、插件化或需大量相似对象的系统。不复杂但容易忽略深拷贝细节,写对了就非常稳健。
# 编码
# c++
# 注册表
# red
# String
# 面向对象
# 成员变量
# 成员函数
# 构造函数
# const
# auto
# 字符串
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# 空指针
# map
# 对象
# prototype
# 自定义
# 可选
# 管理器
# 动态分配
# 句柄
# 适用于
# 你能
# 重写
# 它不
# 并由
相关文章:
建站之星如何防范黑客攻击与数据泄露?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星云端配置指南:模板选择与SEO优化一键生成
微信小程序 五星评分(包括半颗星评分)实例代码
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何通过.red域名打造高辨识度品牌网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过云梦建站系统实现SEO快速优化?
javascript基本数据类型及类型检测常用方法小结
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
建站之星安装后如何配置SEO及设计样式?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何配置FTP站点权限与安全设置?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何高效利用亚马逊云主机搭建企业网站?
如何在搬瓦工VPS快速搭建网站?
如何高效配置IIS服务器搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Python路径拼接规范_跨平台处理说明【指导】
,石家庄四十八中学官网?
如何快速建站并高效导出源代码?
外贸公司网站制作哪家好,maersk船公司官网?
如何在IIS服务器上快速部署高效网站?
西安专业网站制作公司有哪些,陕西省建行官方网站?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
如何批量查询域名的建站时间记录?
建站主机系统SEO优化与智能配置核心关键词操作指南
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何注册花生壳免费域名并搭建个人网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
如何获取免费开源的自助建站系统源码?
C++如何编写函数模板?(泛型编程入门)
如何规划企业建站流程的关键步骤?
C++时间戳转换成日期时间的步骤和示例代码
建站之星安装后界面空白如何解决?
如何自定义建站之星网站的导航菜单样式?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何在阿里云部署织梦网站?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
如何用花生壳三步快速搭建专属网站?
建站之星图片链接生成指南:自助建站与智能设计教程
打鱼网站制作软件,波克捕鱼官方号怎么注册?
*请认真填写需求信息,我们会在24小时内与您取得联系。