享元模式具体实例(含代码)

学习目标:

  • 了解享元模式

学习内容:

享元模式(Flyweight Pattern)在现实生活中可以用来优化资源的使用,尤其是在需要大量创建相似对象的场景下。一个经典的现实生活例子是文本编辑器中的字符对象管理。

文本编辑器中的字符对象

假设你在使用一个文本编辑器。编辑器中会显示大量的字符,每个字符都是一个对象。如果每个字符都独立存储其样式、字体、颜色等信息,这将会占用大量内存。而实际上,许多字符是相同的,可以共享其样式和其他信息。这时候,享元模式就可以派上用场。

享元模式的应用

  • 享元对象(Flyweight Object):表示字符对象,它们共享相同的样式和其他属性。
  • 享元工厂(Flyweight Factory):管理和创建享元对象,确保相同的字符共享相同的对象。
  • 外部状态(Extrinsic State):字符的位置等不会被共享的属性。

代码实现

bash 复制代码
import java.util.HashMap;
import java.util.Map;

// 享元接口
interface Flyweight {
    void display(int row, int col);
}

// 具体享元类
class CharacterFlyweight implements Flyweight {
    private char character;

    public CharacterFlyweight(char character) {
        this.character = character;
    }

    @Override
    public void display(int row, int col) {
        System.out.println("Character: " + character + " at (" + row + ", " + col + ")");
    }
}

// 享元工厂
class FlyweightFactory {
    private Map<Character, Flyweight> flyweightMap = new HashMap<>();

    public Flyweight getFlyweight(char character) {
        Flyweight flyweight = flyweightMap.get(character);
        if (flyweight == null) {
            flyweight = new CharacterFlyweight(character);
            flyweightMap.put(character, flyweight);
        }
        return flyweight;
    }
}

// 客户端代码
public class TextEditor {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        String document = "Hello, World!";
        int row = 0;

        for (int col = 0; col < document.length(); col++) {
            char c = document.charAt(col);
            Flyweight flyweight = factory.getFlyweight(c);
            flyweight.display(row, col);
        }
    }
}

解释

  • 享元接口(Flyweight):定义一个方法 display,用来显示字符及其位置。
  • 具体享元类(CharacterFlyweight):实现享元接口,表示一个具体的字符。
  • 享元工厂(FlyweightFactory):管理享元对象的创建和缓存,确保相同的字符共享相同的对象。
  • 客户端代码(TextEditor):模拟一个文本编辑器,在文档中显示字符时,通过享元工厂获取共享的字符对象。

优点

  • 减少内存使用:通过共享字符对象,减少了系统中字符对象的数量,节省了内存。
  • 提高性能:减少了对象的创建和销毁,提高了性能。

缺点

  • 增加复杂性:需要维护共享对象的工厂和外部状态,增加了系统的复杂性。
  • 非共享状态的管理:需要额外的逻辑来处理非共享状态(例如字符的位置)。

总结

通过这个例子,我们可以看到享元模式如何在现实生活中应用,特别是在需要大量创建相似对象的场景下。享元模式通过共享对象来减少内存使用和提高性能,但也需要处理好共享对象的管理和非共享状态的维护。


相关推荐
sniper_fandc8 分钟前
SpringBoot系列—入门
java·spring boot·后端
好开心啊没烦恼13 分钟前
Python 数据分析:计算,分组统计1,df.groupby()。听故事学知识点怎么这么容易?
开发语言·python·数据挖掘·数据分析·pandas
lljss20201 小时前
Python11中创建虚拟环境、安装 TensorFlow
开发语言·python·tensorflow
代码的余温1 小时前
Maven引入第三方JAR包实战指南
java·maven·jar
Python×CATIA工业智造4 小时前
Frida RPC高级应用:动态模拟执行Android so文件实战指南
开发语言·python·pycharm
pianmian15 小时前
类(JavaBean类)和对象
java
我叫小白菜5 小时前
【Java_EE】单例模式、阻塞队列、线程池、定时器
java·开发语言
狐凄5 小时前
Python实例题:基于 Python 的简单聊天机器人
开发语言·python
Albert Edison6 小时前
【最新版】IntelliJ IDEA 2025 创建 SpringBoot 项目
java·spring boot·intellij-idea
超级小忍6 小时前
JVM 中的垃圾回收算法及垃圾回收器详解
java·jvm