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


    学习目标:

    • 了解享元模式

    学习内容:

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

    文本编辑器中的字符对象

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

    享元模式的应用

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

    代码实现

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

    优点

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

    缺点

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

    总结

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


  • 相关阅读:
    Redis集群高可用架构
    pnpm为什么卸载卸载不干净
    SIMD指令集介绍
    人生的镜像-菌群人生,从出生到死亡的菌群演替
    SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现
    Python自动化UI测试之Selenium基础实操
    苹果手机用什么无线耳机比较好?苹果耳机平替品牌推荐
    【Cisco Packet Tracer】交换机划分Vlan实验
    vue修改 el-input 输入框默认背景色
    【Linux】关于ssh
  • 原文地址:https://blog.csdn.net/weixin_56431011/article/details/139298183