• 享元模式介绍(含案例代码)


    学习目标:

    • 了解享元模式

    学习内容:

    享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少创建对象的数量,以节省内存和提高性能。这个模式通过共享尽可能多的细节来有效地支持大量细粒度对象。

    享元模式的基本思想

    享元模式通过将多个对象的共享部分提取出来,只保留它们之间的差异,从而减少内存的使用。这种共享的部分称为“享元”(Flyweight),而不共享的部分则称为“非享元状态”。

    享元模式的结构

    • 享元接口(Flyweight Interface):定义了享元对象的方法,可以接收并作用于外部状态。
    • 具体享元类(Concrete Flyweight Class):实现享元接口,并且存储对象的内部状态。具体享元对象是可以共享的。
    • 非共享具体享元类(Unshared Concrete Flyweight Class):并非所有的具体享元对象都可以共享,非共享具体享元类就是那些不需要共享的类。
    • 享元工厂(Flyweight Factory):负责创建和管理享元对象,确保合理地共享享元对象。工厂类通过一个存储已经创建的享元对象的池来维护这些对象。

    享元模式的实现

    享元模式的实现可以分为两个状态:内部状态和外部状态。内部状态是存储在享元对象内部的共享状态,不会随环境改变而改变;外部状态是随环境改变的不可共享状态,必须由客户端自行维护。

    示例代码

    // 享元接口
    public interface Flyweight {
        void operation(String externalState);
    }
    
    // 具体享元类
    public class ConcreteFlyweight implements Flyweight {
        private String intrinsicState;
    
        public ConcreteFlyweight(String intrinsicState) {
            this.intrinsicState = intrinsicState;
        }
    
        @Override
        public void operation(String externalState) {
            System.out.println("Intrinsic State = " + intrinsicState + ", External State = " + externalState);
        }
    }
    
    // 享元工厂
    import java.util.HashMap;
    import java.util.Map;
    
    public class FlyweightFactory {
        private Map<String, Flyweight> flyweights = new HashMap<>();
    
        public Flyweight getFlyweight(String key) {
            if (!flyweights.containsKey(key)) {
                flyweights.put(key, new ConcreteFlyweight(key));
            }
            return flyweights.get(key);
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            FlyweightFactory factory = new FlyweightFactory();
    
            Flyweight flyweight1 = factory.getFlyweight("A");
            flyweight1.operation("First Call");
    
            Flyweight flyweight2 = factory.getFlyweight("A");
            flyweight2.operation("Second Call");
    
            Flyweight flyweight3 = factory.getFlyweight("B");
            flyweight3.operation("Third Call");
        }
    }
    

    使用场景

    • 系统中有大量相似对象:这时可以使用享元模式来减少对象的数量。
    • 对象的数量使得内存消耗过大:通过共享对象,可以显著减少内存使用。
    • 大部分对象的状态可以外部化:即对象的外部状态可以由客户端来维护。

    优点

    • 减少对象的创建:通过共享对象,减少了系统中对象的数量,节省了内存。
    • 提高性能:减少了内存消耗和垃圾回收的负担,从而提升了系统的性能。

    缺点

    • 增加了系统的复杂性:需要分离内部状态和外部状态,并且客户端需要维护外部状态。
    • 使代码更加难以理解和维护:享元模式的实现需要较高的抽象和设计技巧。

    总的来说,享元模式在需要高效管理大量相似对象的场景下非常有用,但在实现时需要仔细设计以平衡性能和复杂性。


  • 相关阅读:
    C语言09、字符串函数和内存函数
    剑指 Offer II 027 回文链表 c++
    经纬高坐标转东北天坐标
    Kafka保证消息幂等以及解决方案
    Git 分支管理规范
    Hexagon_V65_Programmers_Reference_Manual(10)
    商城免费搭建之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c
    消防应急照明和疏散指示系统在城市隧道中的应用
    自然语言处理应用(三):微调BERT
    要远离职场中的哪几类人
  • 原文地址:https://blog.csdn.net/weixin_56431011/article/details/139258942