GO设计模式——13、享元模式(结构型)

目录

享元模式(Flyweight Pattern)

享元模式的核心角色:

优缺点

使用场景

注意事项

代码实现


享元模式(Flyweight Pattern)

        享元模式(Flyweight Pattern)它通过共享对象来减少内存使用和提高性能。享元模式的核心思想是共享,当需要创建一个新对象时,首先检查是否已经有与其相同的对象存在,如果存在,则直接返回该对象的引用;如果不存在,则创建一个新对象并将其加入对象池中以供下次使用。通过这种方式,可以避免重复创建相同的对象,从而减少内存占用和提高性能。

        使用享元模式需要有两个前提:(1)享元对象不可变:当享元模式创建出来后,它的变量和属性不会被修改;(2)系统中存在大量重复对象:这些重复对象可以使用同一个享元,内存中只存在一份,这样会节省大量空间。当然这也是为什么享元对象不可变的原因,因为有很多引用,变更的话会引起很多问题。

享元模式的核心角色

  • 享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(Flyweight Pool),用于存储已经创建的享元对象。
  • 享元对象(Flyweight):表示可以共享的对象。享元对象通常包含内部状态和外部状态。内部状态是不变的,可以被多个对象共享;外部状态是可变的,每个对象都有自己的外部状态。

优缺点

(1)优点:

  • 缩小对象的创立,升高内存中对象的数量,升高零碎的内存,提高效率。
  • 缩小内存之外的其余资源占用。

(2)缺点:

  • 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
  • 读取享元模式的外部状态会使得运行时间稍微变长。

使用场景

  • 系统有大量相似对象。
  • 需要缓冲池的场景。

注意事项

  • (1)注意划分外部状态和内部状态,否则可能会引起线程安全问题。
  • (2)这些类必须有一个工厂对象加以控制。

代码实现

package mainimport "fmt"// 一个文字编辑器,需要处理大量的字符对象。每个字符对象都有自己的字体、大小和颜色等属性。由于字符对象可能非常多,
// 如果每个字符对象都占用大量内存,将导致内存消耗过大。我们希望能够通过共享相同属性的字符对象,来减少内存使用。// 享元对象:字符对象
type Character struct {char  runefont  stringsize  intcolor string
}func (c *Character) Display() {fmt.Printf("Character: %c, Font: %s, Size: %d, Color: %s\n", c.char, c.font, c.size, c.color)
}// 享元工厂:字符工厂
type CharacterFactory struct {characters map[rune]*Character
}func NewCharacterFactory() *CharacterFactory {return &CharacterFactory{characters: make(map[rune]*Character),}
}func (f *CharacterFactory) GetCharacter(char rune, font string, size int, color string) *Character {key := charif _, ok := f.characters[key]; !ok {f.characters[key] = &Character{char:  char,font:  font,size:  size,color: color,}}return f.characters[key]
}// 客户端代码
func main() {factory := NewCharacterFactory()char1 := factory.GetCharacter('A', "Arial", 12, "Red")char1.Display()char2 := factory.GetCharacter('A', "Times New Roman", 14, "Blue")char2.Display()char3 := factory.GetCharacter('B', "Times New Roman", 14, "Blue")char3.Display()char4 := factory.GetCharacter('B', "Arial", 12, "Red")char4.Display()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rask AI引领革新,推出多扬声器口型同步技术,打造本地化内容新纪元

“ Rask AI是一个先进的AI驱动视频和音频本地化工具,旨在帮助内容创作者和公司快速、高效地将他们的视频转换成60多种语言。通过不断创新和改进产品功能,Rask AI正塑造着未来媒体产业的发展趋势。 ” 在多语种内容创作的新时代,Rask AI不断突…

Day53力扣打卡

打卡记录 重新规划路线(dfs) 链接 class Solution:def dfs(self, x: int, parent: int, e: List[List[List[int]]]) -> int:res 0for edge in e[x]:if edge[0] parent:continueres edge[1] self.dfs(edge[0], x, e)return resdef minReorder(se…

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(三)——serverless数据分析

3 serverless数据分析 大纲 3 serverless数据分析3.1 创建Lambda3.2 创建API Gateway3.3 结果3.4 总结 3.1 创建Lambda 在Lambda中,我们将使用python3作为代码语言。 步骤图例1、入口2、创建(我们选择使用python3.7)3、IAM权限(…

TDengine统计数据库占用空间

TDengine 目前只提供统计超级表占用空间的工具: 2.x 版本使用 select _block_dist() from STABLE_NAME3.x 版本使用 show table distributed STABLE_NAME 但以上的统计结果并不准确。 如果想统计 DB 使用的空间,只能通过统计所属 vnode 占用空间进行统…

PHP代码检查网站是否能正常打开,检查ssl证书

检查公司网站能否正常打开和检查SSL证书是否过期的重要性不容忽视。公司网站众多, 人工一个个去检查太费时费力, 所以用定时任务跑代码去检查; 1 检查公司网站能否正常打开 对于一个企业来说,网站是其在线形象和客户联系企业的主要途径。如果网站无法正常打开&…

第二十一章——网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信,必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称,是一种网络协议。Internet 网络采用的协议是TCP/IP协议,其全称是Transmission…

uniapp 显示文件流图片

如果是需要将文件流保存到相册,可以先转base64.详情见>uniapp app将base64保存到相册,uniapp app将文件流保存到相册-CSDN博客 uni.request({url: "www.baidu.com",data: {},header: {content-type:application/json,Authorization: "token"…

展望2024年供应链安全

2023年是开展供应链安全,尤其是开源治理如火如荼的一年,开源治理是供应链安全最重要的一个方面,所以我们从开源治理谈起。我们先回顾一下2023的开源治理情况。我们从信通院《2023年中国企业开源治理全景观察》发布的信息。信通院调研了来自七…

渐进式web全栈blazor web

渐进式 vue是渐进式web前端框架,所谓的渐进式就是你不用一开始就整个项目全部使用vue,因为开始你可能并不熟悉vue,而是开始只使用vue的些简单功能,慢慢用它更复杂更好的功能,最终项目可能完全使用vue。 渐进式blazor…

1+x网络系统建设与运维(中级)-练习题4

一.设备命名 LSW1 <Huawei>sys [Huawei]sysn LSW1 [LSW1]un in en 同理可得&#xff0c;给所有设备如以上命令一样配置 二.VLAN LSW1 [LSW1]vlan ba 1 10 20 100 [LSW1]int g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type trunk [LSW1-GigabitEthernet0/0/1]port tru…

K线图详解

K线图是一种常用于股票、外汇和数字货币等金融市场的图表形式&#xff0c;它提供了价格走势的可视化展示。每根K线代表了一个特定时间周期内的价格变动情况。 每根K线由四个关键价格构成&#xff1a;开盘价&#xff08;Open&#xff09;、收盘价&#xff08;Close&#xff09;…

Redis 环境搭建

文章目录 第1关&#xff1a;Redis 环境搭建 第1关&#xff1a;Redis 环境搭建 编程要求 根据上述相关知识&#xff0c;在右侧命令行中完成 Redis 集群的部署与安装。 安装完成后&#xff0c;使用 echo “cluster nodes”|redis-cli -p 7001 -c >/root/test.txt 将结果保存。…

@德人合科技 | 数据透明加密防泄密系统\文件文档加密\设计图纸加密|源代码加密防泄密软件系统,——防止内部办公终端核心文件数据/资料外泄!

一款专业的数据防泄密管理系统&#xff0c;它采用了多种加密模式&#xff0c;包括透明加密、半透明加密和落地加密等&#xff0c;可以有效地保护企业的核心数据安全。 PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee …

【前端】没有了element时,怎么实现一个自己的form表单组件和表单校验(用法参考el-form)

需求 平时用习惯了el-form做表单校验&#xff0c;等到做小程序是&#xff0c;不能用element了很不习惯&#xff0c;准备自己手撸一个form表单组件做平替。 代码 form.vue <template><div class"cwx-form" ref"myForm"><slot></sl…

el-table操作栏按钮过多 增加展开/收起功能

是的 如图所示有那么一条数据 列表操作栏的按钮七八个 小屏笔记本啥数据项也别看了 就剩下个固定列大刺刺的占着整个页面 解决方法&#xff1a; <el-table-column :width"tableToggle ? 600 : 300" label"操作栏" align"center" header-ali…

idea安装包下载

idea安装教程 IDEA安装包链接&#xff1a;https://pan.baidu.com/s/15dEPF2hV3WPiFWMwGOsKWQ 提取码&#xff1a;kxl7 有激活部署的文档说明&#xff0c;下载自己看吧&#xff0c; 链接&#xff1a;https://pan.baidu.com/s/11yh8cz0R86Ngl7EJN8_5FA 提取码&#xff1a;mdg6

Redis 消息队列

本篇概要&#xff1a; 1. 消息队列作用、list类型实现最简单的队列&#xff1b;2. list消息队列&#xff1a;消费者出现异常时的补救方案&#xff1b; 1. 消息队列作用、list类型实现最简单的队列&#xff1b; 提高响应速度、解耦、稳定性&#xff08;故障处理&#xff09;、可…

苍穹外卖+git开源

搁置了很久重新开始学 为了学习方便&#xff0c;苍穹外卖的前后端代码已放至git开源。 源代码-->sky-take-out: 苍穹外卖 git学习-->Git基础使用-CSDN博客 后端接口员工管理和分类管理模块 添加员工表单分析&#xff0c;添加的表单账号、手机号、身份证都是码…

InterLM代码解析

interLM的Transformer架构&#xff0c;重要模块的实现解析 Decoder架构 class InternLMDecoderLayer(nn.Module):def __init__(self, config: InternLMXComposerConfig):super().__init__()self.hidden_size config.hidden_sizeif hasattr(config,intern_converted_llm) and c…

vuepress路径问题,导致图片不显示

图片不显示&#xff0c;报 Uncaught SyntaxError: Unexpected token <错误 很可能就是&#xff1a;路径配置原因 1.当设置为 / 时&#xff0c;VuePress 会假设你的站点将部署到服务器的根路径&#xff0c; 例如 https://yourdomain.com/。 2.生成的页面链接和资源引用将以…