【设计模式】第13节:结构型模式之“享元模式”

news2024/11/19 7:26:45

一、简介

所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。

实现:通过工厂模式,在工厂类中,通过一个Map或者List来缓存已经创建好的享元对象,以达到复用的目的。把实例的共享状态和不共享状态分开。

二、UML类图

请添加图片描述

三、案例

以下是画图器画圆的场景,圆形只有黑色和红色两种,所以可以共享复用。

package main

import "fmt"

const (
	BLACK = 0
	RED   = 1
)

type CircleUnit struct {
	Color int
}

func NewCircleUnit(color int) CircleUnit {
	return CircleUnit{Color: color}
}

type CircleUnitFactory struct {
	CircleMap map[int]CircleUnit
}

func (cuf *CircleUnitFactory) Init() {
	blackCircle := NewCircleUnit(BLACK)
	redCircle := NewCircleUnit(RED)
	cuf.CircleMap = make(map[int]CircleUnit)
	cuf.CircleMap[blackCircle.Color] = blackCircle
	cuf.CircleMap[redCircle.Color] = redCircle
}

func (cuf *CircleUnitFactory) GetCircleUnit(color int) (CircleUnit, error) {
	cu, ok := cuf.CircleMap[color]
	if !ok {
		return cu, fmt.Errorf("color[%v] is not exist", color)
	}
	return cu, nil
}

type Circle struct {
	ID         int
	CircleUnit CircleUnit
	X          int
	Y          int
}

func NewCircle(id int, circleUnit CircleUnit, x, y int) Circle {
	circle := Circle{}
	circle.ID = id
	circle.CircleUnit = circleUnit
	circle.X = x
	circle.Y = y
	return circle
}

type DrawingBoard struct {
	CircleMap map[int]Circle
}

func (db *DrawingBoard) Init() {
	db.CircleMap = make(map[int]Circle)
}

func (db *DrawingBoard) Draw(circle Circle) {
	db.CircleMap[circle.ID] = circle
}

func (db *DrawingBoard) Show() {
	for k, v := range db.CircleMap {
		fmt.Printf("id: %v, color: %v, x: %v, y: %v\n", k, v.CircleUnit.Color, v.X, v.Y)
	}
}

func main() {
	circleUnitFactory := CircleUnitFactory{}
	circleUnitFactory.Init()
	drawingBoard := DrawingBoard{}
	drawingBoard.Init()

	black, _ := circleUnitFactory.GetCircleUnit(BLACK)
	red, _ := circleUnitFactory.GetCircleUnit(RED)
	drawingBoard.Draw(NewCircle(1, black, 1, 1))
	drawingBoard.Draw(NewCircle(2, red, 2, 2))
	drawingBoard.Draw(NewCircle(3, black, 3, 3))

	drawingBoard.Show()
}

四、对比

享元模式VS单例、缓存、对象池:应用单例模式是为了保证对象全局唯一。应用享元模式是为了实现对象复用,节省内存。缓存是为了提高访问效率,而非复用。池化技术中的“复用”理解为“重复使用”,主要是为了节省时间。

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

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

相关文章

这样的软件测试报告模板你绝对没见过!!!

测试报告如此重要,那么我们应该如何撰写呢?为了让大家彻底掌握测试模板的撰写,所以本文结构如下: 1、测试报告写给谁看? 2、测试报告的基本骨架(通过|不通过)? 3、测试报告如何才能达…

超级搜索技术,普通人变强的唯一外挂

搜索效率:Google >微信公众号 >短视频 >百度 1、信息咨询搜索 在Google搜索栏前面加上 “” 限定关键词 intitle 限定标题 allintitle 限定标题多个关键词 intext 限定内容关键词 inurl 限定网址关键词 site 限定网址来源 imagesize 限定图片尺寸 filet…

[LeetCode]-27. 移除元素-26.删除有序数组中的重复项-88.合并两个有序数组

目录 27.移除元素 题目 思路 代码 26. 删除有序数组中的重复项 题目 思路 代码 88.合并两个有序数组 题目 思路 代码 总结 27.移除元素 27. 移除元素 - 力扣(LeetCode)https://leetcode.cn/problems/remove-element/description/ 题目 给你一…

【快报】正在把教学视频搬运到B站和油管

hello 大家好,我是老戴。 熟悉我的同学知道,我从14年开始录制GIS相关的教学视频,之前是放到优酷上给大家下载,后期发现很多人把视频弄下来淘宝上卖,然后我就把视频整体放到了我自己的网站上。 随着视频录制的数量越来…

C++归并排序算法的应用:计算右侧小于当前元素的个数

题目 给你一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 示例 1: 输入:nums [5,2,6,1] 输出:[2,1,1,0] 解释: 5 …

2024年湖北武汉建筑企业三类人员安全员ABC怎么报考

2024年湖北武汉建筑企业三类人员安全员ABC怎么报考 武汉建筑企业报考三类人员,建筑单位归属地在武汉,且有建筑相关的一些资Z,才可以申报一定数量的三类人员、安全员ABC、建筑安全员ABC、专职安全员C证、建设厅安全员ABC证。 建筑企业-报考建…

在线开发平台是什么?有哪些优势?

目录 一、什么是在线开发平台? 二、企业为什么选择在线开发平台? (1)风险低,回报高 (2)可视化操作更形象 (3)易维护 三、在线开发平台功能展示 技术介绍 随着互联网和信息…

Jetpack:024-Jetpack中的滚动事件

文章目录 1. 概念介绍2. 使用方法2.1 高级事件2.2 低级事件 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack中事件相关的内容,本章回中主要 介绍事件中的滚动事件。闲话休提,让我们一起Talk Android Jetpack吧! 1. 概念介绍 我们在…

三相马达的电机故障维护

目录 电机故障维护​编辑 更换电机操作 三相电路 热继电器 今天继续小编的工作经验的分享,今天就说说遇到的问题吧,今天组立熔接机出现故障,后面部分出现了“咕噜噜”的杂声,走到后面一听是电机发出的声音。没有办法了就开始拆…

Py之transformers_stream_generator:transformers_stream_generator的简介、安装、使用方法之详细攻略

Py之transformers_stream_generator:transformers_stream_generator的简介、安装、使用方法之详细攻略 目录 transformers_stream_generator的简介 1、Web Demo T1、original T2、stream transformers_stream_generator的安装 transformers_stream_generator的…

【Linux虚拟机】 JDK、Tomcat、MySQL安装配置讲解

目录 一、上传安装包到服务器 二、JDK与Tomcat安装 2.1 解压安装包 2.2 配置JDK环境变量 2.3 配置Tomcat环境 三、MySQL安装配置 3.1 删除默认数据库 3.2 安装mysql安装包 3.3 mysql初始化操作 四、后端接口部署 4.1 导入项目.war 4.2 新建数据库 4.3 运行服务器项目…

白票某度自媒体混剪剪辑视频素材/爬虫软件说明文档

大家好,我是淘小白~ 软件:某度自媒体混剪素材爬虫软件 语言:Python 说明文档: 1、自定义关键词采集 2、采集百度aigc视频素材,经过测试,使用剪映的文字成片某度视频素材,可过头条的原创检测…

SPSS单样本t检验

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

OSFP基础实验

目录 题目:拓扑如下 实验步骤: 第一步:设计思路 第二步:搭建拓扑 第三步:配置命令 1)IP地址配置 2)OSPF配置 3)R3部分接口做静默接口 4)缺省路由 5&#xff09…

数据结构之“初窥门径”

目录 前言: 一,数据结构起源 二,基本概念和术语 2.1数据 2.2数据元素 2.3数据项 2.4数据对象 2.5数据结构 三,逻辑结构与物理结构 3.1逻辑结构 3.1.1集合结构 3.1.2线性结构 3.1.3树形结构 3.1.4图形结构 3.2物理结…

unity中meta文件GUID异常问题

错误信息: The .meta file Assets/Scripts/Editor/ConvertConfigToBinary/TxtConverter.cs.meta does not have a valid GUID and its corresponding Asset file will be ignored. If this file is not malformed, please add a GUID, or delete the .meta file and…

深度了解msvcr110.dll丢失的5个解决方法以及原因

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcr110.dll丢失”。这个错误提示通常出现在运行某些程序时,它意味着计算机无法找到所需的动态链接库文件。本文将详细介绍msvcr110.dll丢失的原因以及5个解决方法。 一、msvc…

[Unity+智谱AI开放平台]调用ChatGLM Tuobo模型驱动AI小姐姐数字人

1.简述 本篇文章主要介绍一下,在Unity端,集成智谱AI开放平台提供的chatglm模型api,实现AI聊天互动相关的功能。从智谱AI官方站点上看到,提供有chatglm turbo的公共模型服务,能够实现32K超长上下文,应用到我…

Python 中__name__ == ‘__main__‘使用说明

在学习C语言的时候,程序的运行是从main函数开始的,因此,功能代码一般写到main函数中,子程序如果想要调用,也需要在main函数中进行调用。 然而,Python语言中,程序从第一行就开始执行(定义函数除外…

不同源安装nginx

Nginx是一款高性能的Web服务器软件。在安装Nginx时,可以选择不同的安装源。 1.官方源:在官方网站下载Nginx的源代码,然后进行编译安装。 2.EPEL源:EPEL (Extra Packages for Enterprise Linux)源是针对Red Hat、CentOS、Scienti…