// 享元接口或基类
class CharacterStyle {
public:
CharacterStyle(const std::string& font, int size, const std::string& color)
: font(font), size(size), color_(color) {}
void display(const std::string& content) const {
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Text: " zuojiankuohaophpcnzuojiankuohaophpcn content
zuojiankuohaophpcnzuojiankuohaophpcn " | Font: " zuojiankuohaophpcnzuojiankuohaophpcn font_
zuojiankuohaophpcnzuojiankuohaophpcn ", Size: " zuojiankuohaophpcnzuojiankuohaophpcn size_
zuojiankuohaophpcnzuojiankuohaophpcn ", Color: " zuojiankuohaophpcnzuojiankuohaophpcn color_ zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
}private:
std::string font;
int size;
std::string color_;
};
// 享元工厂
class StyleFactory {
public:
CharacterStyle* getStyle(const std::string& font, int size, const std::string& color) {
std::string key = font + "-" + std::to_string(size) + "-" + color;
if (styles.find(key) == styles.end()) {
styles[key] = new CharacterStyle(font, size, color);
}
return styles[key];
}
~StyleFactory() {
for (auto& pair : styles) {
delete pair.second;
}
}private:
std::map<:string characterstyle> styles;
};
上面代码中,CharacterStyle 表示字体样式,其内部状态是字体、大小和颜色。工厂通过组合这些属性生成唯一键,确保相同样式的对象只创建一次。
客户端使用示例
客户端通过工厂获取享元对象,并传入外部状态(如具体显示的文本内容)来使用。
int main() {
StyleFactory factory;
// 模拟文档中有多个字符,但只有几种样式
CharacterStyle* style1 = factory.getStyle("Arial", 12, "black");
CharacterStyle* style2 = factory.getStyle("Times New Roman", 14, "red");
CharacterStyle* style3 = factory.getStyle("Arial", 12, "black"); // 应该复用 style1
style1-youjiankuohaophpcndisplay("Hello");
style2-youjiankuohaophpcndisplay("World");
style3-youjiankuohaophpcndisplay("!");
// 验证是否为同一对象
std::cout zuojiankuohaophpcnzuojiankuohaophpcn "style1 == style3: " zuojiankuohaophpcnzuojiankuohaophpcn (style1 == style3 ? "true" : "false") zuojiankuohaophpcnzuojiankuohaophpcn std::endl;
return 0;}
输出结果会显示,尽管请求了两次相同的样式,但实际返回的是同一个对象指针,有效减少了内存占用。
注意事项与优化建议
- 享元对象应设计为不可变(immutable),以保证共享安全。一旦创建,其内部状态不应被修改。
- 工厂需管理对象生命周期,避免内存泄漏。可考虑使用智能指针(如
std::shared_ptr)替代原始指针。
- 键的生成要高效且无歧义,推荐使用字符串拼接或哈希方式。
- 并非所有对象都适合做享元。仅当对象创建频繁、内部状态高度重复时才值得引入。
基本上就这些。享元模式通过共享减少对象数量,在C++中结合工厂和容器能有效控制内存使用,特别适合资源敏感的应用场景。关键在于合理划分内外状态,确保共享的安全与高效。
# c++
# ai
# ios
# stream
# 游戏开发
# 内存占用
# red
# String
# 成员变量
# const
# 字符串
# int
# 指针
# class
# public
# private
# map
# 对象
# 多个
# 适用于
# 客户端
# 两类
# 复用
# 的是
# 是一种
# 中有
# 只需
# 推荐使用
相关文章:
公司网站的制作公司,企业网站制作基本流程有哪些?
大型企业网站制作流程,做网站需要注册公司吗?
大连 网站制作,大连天途有线官网?
建站与域名管理如何高效结合?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
建站DNS解析失败?如何正确配置域名服务器?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
网站企业制作流程,用什么语言做企业网站比较好?
香港服务器如何优化才能显著提升网站加载速度?
建站之星如何通过成品分离优化网站效率?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
建站之星后台密码如何安全设置与找回?
如何制作网站标识牌,动态网站如何制作(教程)?
红河网站制作公司,红河事业单位身份证如何上传?
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何选择服务器才能高效搭建专属网站?
如何快速上传自定义模板至建站之星?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
如何获取PHP WAP自助建站系统源码?
如何在香港免费服务器上快速搭建网站?
如何获取开源自助建站系统免费下载链接?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
建站主机SSH密钥生成步骤及常见问题解答?
建站之星云端配置指南:模板选择与SEO优化一键生成
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
西安大型网站制作公司,西安招聘网站最好的是哪个?
营销式网站制作方案,销售哪个网站招聘效果最好?
建站VPS选购需注意哪些关键参数?
建站之星安装后界面空白如何解决?
安云自助建站系统如何快速提升SEO排名?
如何在橙子建站中快速调整背景颜色?
海南网站制作公司有哪些,海口网是哪家的?
如何快速搭建个人网站并优化SEO?
装修招标网站设计制作流程,装修招标流程?
历史网站制作软件,华为如何找回被删除的网站?
淘宝制作网站有哪些,淘宝网官网主页?
如何在阿里云虚拟主机上快速搭建个人网站?
建站主机如何选?性能与价格怎样平衡?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
建站之星如何实现PC+手机+微信网站五合一建站?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
贸易公司网站制作流程,出口贸易网站设计怎么做?
建站主机默认首页配置指南:核心功能与访问路径优化
微信h5制作网站有哪些,免费微信H5页面制作工具?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
山东网站制作公司有哪些,山东大源集团官网?
如何在Windows 2008云服务器安全搭建网站?
Java解压缩zip - 解压缩多个文件或文件夹实例
如何用5美元大硬盘VPS安全高效搭建个人网站?