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


    学习目标:

    • 了解享元模式

    学习内容:

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

    优点

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

    缺点

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

    总结

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


  • 相关阅读:
    电脑截图怎么转换成文字?学会这个方法,轻松实现
    什么是XXE攻击?如何进行防护
    揭开ChatGPT面纱(1):准备工作(搭建开发环境运行OpenAI Demo)
    【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 15 At the Department Store 在百货商店
    VScode+python开发,多个解释器切换问题
    Sentinel注解@SentinelResource详解
    开启智慧之旅,AI与机器学习驱动的微服务设计模式探索
    拍案叫绝!阿里内部开源Spring Boot实战+进阶+面试攻略手慢无
    编程堆芯熔融物自然对流的
    java计算机毕业设计果之芒农场销售系统MyBatis+系统+LW文档+源码+调试部署
  • 原文地址:https://blog.csdn.net/weixin_56431011/article/details/139298183