当前位置: 首页 > news >正文

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()
}

相关文章:

  • MAC PHP版本安装问题
  • MySQL数据库从小白到入门(二)
  • 2023年5个自动化EDA库推荐
  • Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码
  • Unity 状态系统
  • 题目:纪念品分组(蓝桥OJ 532)
  • 二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺
  • 玩转大数据10:深度学习与神经网络在大数据中的应用
  • B树你需要了解一下
  • 【python、opencv】opencv仿射变换原理及代码实现
  • 一天一个设计模式---原型模式
  • vue中对pdf文件和路径的处理
  • 项目代码规范
  • 【Hadoop-Distcp】通过Distcp的方式进行两个HDFS集群间的数据迁移
  • QT----Visual Studio打开.ui文件报错无法打开
  • ES6核心特性
  • Git学习与使用心得(1)—— 初始化
  • Joomla 2.x, 3.x useful code cheatsheet
  • Mithril.js 入门介绍
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • PermissionScope Swift4 兼容问题
  • PHP的类修饰符与访问修饰符
  • vue.js框架原理浅析
  • webpack+react项目初体验——记录我的webpack环境配置
  • Windows Containers 大冒险: 容器网络
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 面试遇到的一些题
  • 前嗅ForeSpider教程:创建模板
  • 实习面试笔记
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # 数据结构
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (10)STL算法之搜索(二) 二分查找
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)nginx 安装、启停
  • (3)nginx 配置(nginx.conf)
  • (C++17) optional的使用
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (windows2012共享文件夹和防火墙设置
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (六)Hibernate的二级缓存
  • (六)激光线扫描-三维重建
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • **python多态