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

学习目标:

  • 了解享元模式

学习内容:

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

优点

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

缺点

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

总结

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


相关推荐
儿时可乖了8 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol9 分钟前
java基础概念37:正则表达式2-爬虫
java
I_Am_Me_15 分钟前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
重生之我是数学王子25 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
xmh-sxh-131426 分钟前
jdk各个版本介绍
java
Ai 编码助手27 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z31 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹38 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE39 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码1 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构