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
# 自定义
# 可选
# 管理器
# 动态分配
# 句柄
# 适用于
# 你能
# 重写
# 它不
# 并由
相关文章:
利用JavaScript实现拖拽改变元素大小
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
如何将凡科建站内容保存为本地文件?
如何在IIS中新建站点并配置端口与IP地址?
淘宝制作网站有哪些,淘宝网官网主页?
如何快速搭建响应式可视化网站?
网站代码制作软件有哪些,如何生成自己网站的代码?
小建面朝正北,A点实际方位是否存在偏差?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
完全自定义免费建站平台:主题模板在线生成一站式服务
专业网站建设制作报价,网页设计制作要考什么证?
建站与域名管理如何高效结合?
电商平台网站制作流程,电商网站如何制作?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
如何有效防御Web建站篡改攻击?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
制作旅游网站html,怎样注册旅游网站?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何使用Golang table-driven基准测试_多组数据测量函数效率
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
制作宣传网站的软件,小红书可以宣传网站吗?
如何快速搭建高效简练网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
建站主机功能解析:服务器选择与快速搭建指南
深入理解Android中的xmlns:tools属性
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
制作网站的模板软件,网站怎么建设?
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何在云指建站中生成FTP站点?
PHP 500报错的快速解决方法
制作网页的网站有哪些,电脑上怎么做网页?
长沙企业网站制作哪家好,长沙水业集团官方网站?
魔方云NAT建站如何实现端口转发?
如何彻底删除建站之星生成的Banner?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
如何通过西部数码建站助手快速创建专业网站?
宿州网站制作公司兴策,安徽省低保查询网站?
建站之星后台搭建步骤解析:模板选择与产品管理实操指南
建站主机是什么?如何选择适合的建站主机?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何配置支付宝与微信支付功能?
定制建站价位费用解析与套餐推荐全攻略
Python多线程使用规范_线程安全解析【教程】
Bpmn 2.0的XML文件怎么画流程图
如何自定义建站之星模板颜色并下载新样式?
如何快速搭建高效香港服务器网站?
独立制作一个网站多少钱,建立网站需要花多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。