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
# 自定义
# 可选
# 管理器
# 动态分配
# 句柄
# 适用于
# 你能
# 重写
# 它不
# 并由
相关文章:
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何配置FTP站点权限与安全设置?
如何选择适合PHP云建站的开源框架?
音乐网站服务器如何优化API响应速度?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何快速打造个性化非模板自助建站?
如何选择可靠的免备案建站服务器?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
西安大型网站制作公司,西安招聘网站最好的是哪个?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
小型网站建站如何选择虚拟主机?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何在IIS中配置站点IP、端口及主机头?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
定制建站流程解析:需求评估与SEO优化功能开发指南
大连网站制作公司哪家好一点,大连买房网站哪个好?
如何设置并定期更换建站之星安全管理员密码?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
制作企业网站建设方案,怎样建设一个公司网站?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何通过免费商城建站系统源码自定义网站主题与功能?
常州自助建站费用包含哪些项目?
建站之星在线版空间:自助建站+智能模板一键生成方案
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
孙琪峥织梦建站教程如何优化数据库安全?
,柠檬视频怎样兑换vip?
音响网站制作视频教程,隆霸音响官方网站?
SQL查询语句优化的实用方法总结
如何在企业微信快速生成手机电脑官网?
如何设计高效校园网站?
建站之星Pro快速搭建教程:模板选择与功能配置指南
简历在线制作网站免费版,如何创建个人简历?
建站之星上传入口如何快速找到?
,想在网上投简历,哪几个网站比较好?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
网站app免费制作软件,能免费看各大网站视频的手机app?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
网站制作公司,橙子建站是合法的吗?
临沂网站制作公司有哪些,临沂第四中学官网?
建站VPS能否同时实现高效与安全翻墙?
如何通过二级域名建站提升品牌影响力?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
如何获取PHP WAP自助建站系统源码?
兔展官网 在线制作,怎样制作微信请帖?
如何用AWS免费套餐快速搭建高效网站?
如何选择高性价比服务器搭建个人网站?
如何快速配置高效服务器建站软件?
如何通过远程VPS快速搭建个人网站?
建站之星导航配置指南:自助建站与SEO优化全解析
*请认真填写需求信息,我们会在24小时内与您取得联系。