设计模式 享元模式(Flyweight Pattern)

享元模式 简绍

享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景,通过共享不变的部分来减少对象的数量和内存消耗。

享元模式优缺点

享元模式的优点
  • 节省内存:通过共享享元对象,减少了内存占用。
  • 提高性能:减少了对象的创建数量,提高了程序的性能。
享元模式的缺点
  • 复杂性:实现享元模式可能增加了系统的复杂性,尤其是在维护和理解代码方面。
  • 线程安全性:如果多个线程同时访问享元对象,需要确保线程安全。

享元模式概念

  • 内部状态(Intrinsic State):不会随环境改变的状态,是对象固有的属性,可以被所有实例共享。
  • 外部状态(Extrinsic State):随环境改变的状态,依赖于对象的使用环境,不可以被共享。

享元模式的应用场景

  • 当系统中有大量相似的对象。
  • 这些对象消耗大量内存。
  • 这些对象的大多数状态可以外部化。
  • 这些对象可以通过外部传递其状态来进一步减少系统内存

UML图

代码实现

定义 flyweight 的接口

java 复制代码
public interface FlyweightInterface {
    void test(String extrinsicState);
}

具体享元模式实现FlyweightInterface接口, 查看内外部状态

java 复制代码
public class Flyweight implements FlyweightInterface{

    private String intrinsicState;

    public Flyweight(String intrinsicState){
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void test(String extrinsicState) {
        System.out.println("intrinsicState: " + intrinsicState + "extrinsicState: " + extrinsicState);
    }
}

通过 Map 存储之前对象,获取之前的对象无需重新创建

java 复制代码
public class FlyweightFactory {
    private Map<String, FlyweightInterface> flyweights = new HashMap<>();

    public FlyweightInterface getFlyweight(String intrinsicState) {
        synchronized (this.flyweights) {
            FlyweightInterface flyweight = this.flyweights.get(intrinsicState);
            if (flyweight == null) {
                flyweight = new Flyweight(intrinsicState);
                this.flyweights.put(intrinsicState, flyweight);
                System.out.println("Flyweight " + intrinsicState + " created.");
            }
            return flyweight;
        }
    }
}

实现接口

java 复制代码
public class Main {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        FlyweightInterface test = factory.getFlyweight("test1");
        test.test("ex1");
        System.out.println(test);
        FlyweightInterface test2 = factory.getFlyweight("test2");
        test2.test("ex2");
        System.out.println(test2);

    }
}

使用场景

  1. 大量重复对象的创建
    当需要创建大量的相似对象,并且这些对象大部分状态是相同的或可以共享时,享元模式可以显著减少内存消耗。
  2. 大规模图形或图像应用
    在图形或图像处理软件中,图形对象可以使用享元模式来优化内存使用。图形的形状和样式可以作为享元对象的一部分,而图形的位置、颜色等特性可以作为外部状态传递给享元对象。
  3. 游戏开发
    在游戏开发中,特别是需要处理大量相同类型对象的场景(如子弹、敌人等),可以使用享元模式来减少内存消耗。
相关推荐
忆~遂愿2 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD0017 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东10 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology15 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble19 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域27 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
CodeToGym1 小时前
【Java 办公自动化】Apache POI 入门:手把手教你实现 Excel 导入与导出
java·apache·excel
凡人叶枫1 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
JMchen1232 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio