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

学习目标:

  • 了解享元模式

学习内容:

享元模式(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):模拟一个文本编辑器,在文档中显示字符时,通过享元工厂获取共享的字符对象。

优点

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

缺点

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

总结

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


相关推荐
陌殇殇10 分钟前
Java使用IText7动态生成带审批文本框的PDF文档
java·pdf
wwww.wwww14 分钟前
Qt软件开发-摄像头检测使用软件V1.1
开发语言·c++·qt
weixin_4565881519 分钟前
【Maven】特殊pom.xml配置文件 - BOM
xml·java·maven
bjzhang7521 分钟前
如何创建一个父类 Maven项目,然后在父类下再创建子项目,构建多模块 Maven 项目
java·maven
lyrhhhhhhhh22 分钟前
Maven进阶
java·maven
sugar__salt42 分钟前
多线程(1)——认识线程
java·开发语言
Evand J1 小时前
MATLAB技巧——平滑滤波,给出一定的例程和输出参考
开发语言·matlab
妙极矣1 小时前
JAVAEE初阶01
java·学习·java-ee
碎叶城李白1 小时前
NIO简单群聊
java·nio