设计模式-享元模式实践案例

享元模式(Flyweight Pattern)是一种结构型设计模式,其核心思想是通过共享技术来有效地支持大量细粒度对象的复用,减少创建对象的数量,以节省系统资源,特别是内存。

以下是一个使用 Java 实现享元模式的实践案例:

场景描述

假设我们正在开发一个文本编辑器,需要处理大量的字符对象。每个字符都有自己的样式属性,如字体、大小、颜色等。为了避免为文档中的每个字符创建大量对象,我们可以使用享元模式来重用相同样式的字符对象。

步骤1:创建享元接口

复制代码
1// 字符享元接口
2public interface CharacterFlyweight {
3    void display();
4}

步骤2:实现具体的享元类

复制代码
1// 具体的字符享元类
2public class ConcreteCharacterFlyweight implements CharacterFlyweight {
3    private char character;
4    private String style; // 字体样式,例如字体大小,颜色等
5
6    public ConcreteCharacterFlyweight(char character, String style) {
7        this.character = character;
8        this.style = style;
9    }
10
11    @Override
12    public void display() {
13        System.out.println("Character: " + character + " with Style: " + style);
14    }
15}

步骤3:创建享元工厂类

享元工厂类用于创建和管理享元对象,确保相同的享元只被创建一次。

复制代码
1import java.util.HashMap;
2import java.util.Map;
3
4// 享元工厂类
5public class FlyweightFactory {
6    private Map<String, CharacterFlyweight> flyweights = new HashMap<>();
7
8    public CharacterFlyweight getFlyweight(char character, String style) {
9        String key = character + "-" + style;
10        if (!flyweights.containsKey(key)) {
11            flyweights.put(key, new ConcreteCharacterFlyweight(character, style));
12        }
13        return flyweights.get(key);
14    }
15}

步骤4:客户端代码使用享元模式

复制代码
1public class FlyweightPatternDemo {
2    public static void main(String[] args) {
3        FlyweightFactory factory = new FlyweightFactory();
4        String style = "Font: Arial, Size: 12, Color: Black";
5
6        CharacterFlyweight charA = factory.getFlyweight('A', style);
7        charA.display();
8
9        CharacterFlyweight charB = factory.getFlyweight('B', style);
10        charB.display();
11
12        // 由于样式相同,这里的 charA2 会重用之前创建的 'A' 字符对象
13        CharacterFlyweight charA2 = factory.getFlyweight('A', style);
14        charA2.display();
15
16        // 验证两个 'A' 字符是否是相同的实例
17        System.out.println("charA == charA2: " + (charA == charA2));
18    }
19}

在上述代码中,

ConcreteCharacterFlyweight 是具体的享元类,表示具有特定样式的字符。FlyweightFactory 负责管理享元对象的缓存,getFlyweight 方法确保不会为相同的字符和样式创建多个对象。

客户端代码通过享元工厂来获取享元对象。如果请求了具有相同样式的相同字符,则工厂会返回之前创建的相同对象的引用,而不是创建新对象;这样可以减少实例的数量,节省内存。

享元模式在处理大量类似对象时非常有用,可以显著减少内存消耗。这种模式在图形处理、游戏开发和文本处理等领域中广泛应用。

相关推荐
亿牛云爬虫专家4 小时前
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
分布式·python·架构·kubernetes·爬虫代理·监测·采集
收破烂的小熊猫~7 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
蹦蹦跳跳真可爱5898 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij8 小时前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien8 小时前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
敲键盘的小夜猫9 小时前
LLM复杂记忆存储-多会话隔离案例实战
人工智能·python·langchain
高压锅_12209 小时前
Django Channels WebSocket实时通信实战:从聊天功能到消息推送
python·websocket·django
佛祖让我来巡山10 小时前
【工厂和策略设计模式妙用】解决接口选择与多重if-else 问题
设计模式·策略模式·工厂模式
胖达不服输11 小时前
「日拱一码」020 机器学习——数据处理
人工智能·python·机器学习·数据处理
吴佳浩11 小时前
Python入门指南-番外-LLM-Fingerprint(大语言模型指纹):从技术视角看AI开源生态的边界与挑战
python·llm·mcp