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

学习目标:

  • 了解享元模式

学习内容:

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

优点

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

缺点

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

总结

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


相关推荐
Seven971 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德12 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆14 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌16 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊17 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang18 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang19 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解19 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing1 天前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean1 天前
Jackson View Extension Spring Boot Starter
java·后端