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

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

目录

享元模式(Flyweight Pattern)

享元模式的核心角色:

优缺点

使用场景

注意事项

代码实现


享元模式(Flyweight Pattern)

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

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

享元模式的核心角色

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

优缺点

(1)优点:

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

(2)缺点:

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

使用场景

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

注意事项

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

代码实现

package main

import "fmt"

// 一个文字编辑器,需要处理大量的字符对象。每个字符对象都有自己的字体、大小和颜色等属性。由于字符对象可能非常多,
// 如果每个字符对象都占用大量内存,将导致内存消耗过大。我们希望能够通过共享相同属性的字符对象,来减少内存使用。

// 享元对象:字符对象
type Character struct {
    char  rune
    font  string
    size  int
    color 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 := char
    if _, 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.kler.cn/a/161703.html

相关文章:

  • 闯关leetcode——3178. Find the Child Who Has the Ball After K Seconds
  • 【VIM】vim 常用命令
  • STM32问题集
  • QQ 小程序已发布,但无法被搜索的解决方案
  • 马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察
  • 【stable diffusion部署】超强AI绘画Stable Diffusion,本地部署使用教程,完全免费使用
  • node.js出现version `GLIBC_2.27‘ not found的解决方案
  • oomall课堂笔记
  • 软考2018下午第六题改编逻辑(状态模式)
  • 【动手学深度学习】(十)PyTorch 神经网络基础+GPU
  • QT Windos平台下打包应用程序
  • CSM2433 一款集成2.4G+125K 和8位RISC 的SOC芯片
  • 临时或永久修改linux-kali虚拟机的主机名和遇见的错误解决方法(保姆级图文)【网络工程】
  • 流量分析1--菜刀666
  • [ES]ElasticSearch强转日期的时区问题
  • 备忘录怎么传到电脑?备忘录手机电脑互传方法
  • echarts图之 底部滚动横轴 缩放图形大小
  • 软件开发安全指南
  • IDEA 保存自动ESLint格式化
  • python 涉及opencv mediapipe知识,眨眼计数 供初学者参考
  • 【Linux】进程通信之命名管道mkfifo
  • 【设计模式-3.1】结构型——外观模式
  • GO设计模式——5、建造者模式(创建型)
  • 深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案
  • vuepress路径问题,导致图片不显示
  • 十一.图像处理与光学之图像缩放方式