享元模式 (Flyweight Pattern)

embedded/2024/11/26 17:25:45/

享元模式 (Flyweight Pattern)

享元模式是一种 结构型设计模式,通过共享相同对象,减少内存使用,提升系统性能。该模式适用于大量相似对象的场景,能有效避免重复创建相同对象。


原理

  1. 核心思想
    • 将对象的 内在状态(不变部分)与 外在状态(可变部分)分离。
    • 对于重复的内在状态,共享同一个对象实例。
  2. 适用场景
    • 有大量相似对象。
    • 内存占用成为性能瓶颈。
  3. 关键点
    • 共享内在状态:对象的不可变部分,可被多个对象共享。
    • 独立外在状态:对象的可变部分,由客户端管理。

优点

  1. 减少内存开销:通过共享对象实例,避免重复创建。
  2. 提升性能:适用于资源紧张的场景。

缺点

  1. 代码复杂性增加:需要分离内外状态,并管理共享池。
  2. 引入管理成本:需要额外的工厂或容器管理共享对象。

示例代码

场景描述

假设一个绘图程序需要绘制大量的圆形,但颜色相同的圆形可以共享对象实例。通过享元模式,我们可以避免为每个圆形重复创建对象。


1. 定义抽象享元类
java">// 抽象享元类
public interface Shape {void draw(int x, int y, int radius); // 接收外在状态作为参数
}

2. 创建具体享元类
java">// 具体享元类
public class Circle implements Shape {private String color; // 内在状态public Circle(String color) {this.color = color;}@Overridepublic void draw(int x, int y, int radius) {System.out.println("Drawing Circle [Color: " + color + ", X: " + x + ", Y: " + y + ", Radius: " + radius + "]");}
}

3. 创建享元工厂
java">import java.util.HashMap;
import java.util.Map;// 享元工厂
public class ShapeFactory {private static final Map<String, Shape> circleMap = new HashMap<>();public static Shape getCircle(String color) {Circle circle = (Circle) circleMap.get(color);if (circle == null) {circle = new Circle(color); // 创建新的享元对象circleMap.put(color, circle);System.out.println("Creating new Circle of color: " + color);}return circle;}
}

4. 客户端代码
java">public class FlyweightPatternExample {public static void main(String[] args) {Shape circle1 = ShapeFactory.getCircle("Red");circle1.draw(10, 20, 5);Shape circle2 = ShapeFactory.getCircle("Blue");circle2.draw(15, 25, 10);Shape circle3 = ShapeFactory.getCircle("Red"); // 重复颜色,使用共享对象circle3.draw(20, 30, 15);Shape circle4 = ShapeFactory.getCircle("Green");circle4.draw(25, 35, 20);Shape circle5 = ShapeFactory.getCircle("Blue"); // 重复颜色,使用共享对象circle5.draw(30, 40, 25);}
}

输出结果
Creating new Circle of color: Red
Drawing Circle [Color: Red, X: 10, Y: 20, Radius: 5]
Creating new Circle of color: Blue
Drawing Circle [Color: Blue, X: 15, Y: 25, Radius: 10]
Drawing Circle [Color: Red, X: 20, Y: 30, Radius: 15]
Creating new Circle of color: Green
Drawing Circle [Color: Green, X: 25, Y: 35, Radius: 20]
Drawing Circle [Color: Blue, X: 30, Y: 40, Radius: 25]

UML 类图

        +------------------+|    Shape         |+------------------+| + draw(x, y, r)  |+------------------+^|+------------------+|    Circle        |+------------------+| - color          || + draw(x, y, r)  |+------------------++------------------+| ShapeFactory      |+------------------+| - circleMap       || + getCircle(color)|+------------------+

使用场景

  1. 文字处理软件:如字处理程序中相同字符的共享。
  2. 图形系统:共享相同属性的图形对象。
  3. 缓存管理:如线程池、数据库连接池。

小结

  • 享元模式通过共享对象实例,有效降低内存开销,提升性能。
  • 它需要分离对象的内在状态和外在状态,同时通过工厂管理对象的共享。
  • 适用于需要频繁创建大量相似对象的场景,但要注意外在状态的管理复杂性。

http://www.ppmy.cn/embedded/140670.html

相关文章

【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!

文章目录 修改哈希表模板参数迭代器HashTable 的默认成员函数HashTable 迭代器相关函数HashTable 的 Insert 函数HashTable 的 Find函数HashTable 的 Erase函数 封装 unordered_set封装 unordered_map测试 unordered_set 和 unordered_map 修改哈希表 我们基于链地址法实现的哈…

虚拟浏览器可以应对哪些浏览器安全威胁?

众所周知&#xff0c;互联网安全对企业和个人都至关重要。 因此&#xff0c;在有害的网络内容和终端用户之间必须有一道屏障。浏览器隐私是浏览器安全的一个重要组成部分。不用说也知道&#xff0c;大多数常用的浏览器&#xff0c;都会把最终用户的数据出售给第三方&#xff0c…

git教程

文章目录 简介&#xff1a;使用教程&#xff1a;&#xff08;1&#xff09;安装git&#xff1a;&#xff08;2&#xff09;设置用户名和邮箱作为标识符&#xff1a;&#xff08;3&#xff09;建立本地仓库&#xff1a;本地仓库作用&#xff1a;&#xff08;1&#xff09;将文件…

springboot获取配置文件中的值

概括 在开发过程中&#xff0c;对于一些通用的配置&#xff0c;通常会定在一个配置文件中。通常为application.properties或者application.yml文件中。我们只需要在需要使用的地方通过注解直接获取即可。 使用 在springboot中可以通过使用value注解来读取配置文件中的属性。…

随手记:鼠标触顶方法

// 鼠标触顶方法 scrollMethod() { window.onscroll () > { let t document.documentElement.scrollTop || document.body.scrollTop; if(t > 10) { this.positionStyle.top 0px; }else{ this.positionStyle.top 128px; } } },

Spring Boot OA:企业办公自动化的高效路径

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…

英伟达推出了全新的小型语言模型家族——Hymba 1.5B

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

高性能存储SIG月度动态:重构和优化fuse,推动containerd社区支持erofs

本次月报综合了 SIG 在 9、10 两个月的工作进展&#xff0c;包含多项新特性、优化、Bugfix 等。 一、SIG 整体进展 重构和优化 fuse 代码&#xff0c;为接下来的 writeback 性能优化特性做准备。 containerd erofs snapshotter PR 已提交&#xff0c;社区 review 讨论中。 …