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

学习目标:

  • 了解享元模式

学习内容:

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

优点

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

缺点

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

总结

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


相关推荐
方也_arkling10 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮10 小时前
Spring Bean作用域与生命周期全解析
java·spring
风吹夏回10 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei1110 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_11210 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding10 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋911 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai811 小时前
C# 内存管理与资源泄漏
开发语言·c#
DIY源码阁11 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse