当前位置: 首页 > article >正文

【玩转23种Java设计模式】结构型模式篇:享元模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

  • 一、简介
  • 二、实例:棋盘游戏中的棋子
    • 1、享元接口
    • 2、具体享元类,代表棋子类型
    • 3、享元工厂,负责创建和管理享元对象
    • 4、客户端使用
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

  享元模式(Flyweight Pattern)是一种用于性能优化的结构型设计模式。它通过共享技术,有效地支持大量细粒度的对象。核心思想是将对象的状态分为内部状态和外部状态,内部状态存储在享元对象中,而外部状态则由客户端管理。通过这种方式,多个对象可以共享相同的内部状态,减少内存使用,提高系统性能。

二、实例:棋盘游戏中的棋子

  假设我们正在开发一个棋盘游戏,如国际象棋,棋盘上有多个相同的棋子(如兵、车等)。我们可以使用享元模式来减少这些重复棋子的内存占用。

1、享元接口

interface ChessPiece {
    void display();
}

2、具体享元类,代表棋子类型

class ChessPieceFlyweight implements ChessPiece {
    private String type;

    public ChessPieceFlyweight(String type) {
        this.type = type;
    }

    @Override
    public void display() {
        System.out.println("棋子类型: " + type);
    }
}

3、享元工厂,负责创建和管理享元对象

class ChessPieceFactory {
    private Map<String, ChessPiece> pool = new HashMap<>();

    public ChessPiece getChessPiece(String type) {
        ChessPiece piece = pool.get(type);
        if (piece == null) {
            piece = new ChessPieceFlyweight(type);
            pool.put(type, piece);
        }
        return piece;
    }
}

4、客户端使用

public class ChessGame {
    public static void main(String[] args) {
        ChessPieceFactory factory = new ChessPieceFactory();
        
        ChessPiece pawn1 = factory.getChessPiece("兵");
        ChessPiece pawn2 = factory.getChessPiece("兵");
        
        pawn1.display(); // 输出: 棋子类型: 兵
        pawn2.display(); // 输出: 棋子类型: 兵
        
        // 假设pawn1和pawn2代表棋盘上不同的位置,但共享同一“兵”类型的内存表示
    }
}

三、总结

1、优点

  • 减少内存使用:通过共享减少相同对象的实例化。
  • 提高性能:减少创建和销毁对象的开销。
  • 支持大量对象:适用于需要处理大量相似对象的场景。

2、缺点

  • 设计复杂度增加:需要区分内部状态和外部状态,且外部状态管理变得复杂。
  • 过度使用可能导致理解困难:不恰当的应用可能导致代码难以理解和维护。

3、应用场景

  • 图形界面渲染:如字体、小图标等可复用的GUI元素。
  • 数据库连接池:虽然不是传统意义上的享元模式,但通过池化技术减少了数据库连接的创建。
  • 游戏开发:如角色游戏中大量重复的NPC或道具。
  • 文本编辑器:共享字符对象以减少内存消耗。

  享元模式在需要高效处理大量相似对象时展现其独特价值,通过最小化内存占用,提升系统整体性能,尤其是在资源敏感的环境中。


http://www.kler.cn/a/581163.html

相关文章:

  • QT小项目-简单的记事本
  • 1.5 双指针专题:有效三⻆形的个数(medium)
  • Flink之水印(watermark)的补充理解
  • Linux驱动开发-设备树
  • python高效试用17---两个字符串组成一个新的字符串和两个字符串组成元组作为key哪个更高效
  • PyCharm 接入 DeepSeek、OpenAI、Gemini、Mistral等大模型完整版教程(通用)!
  • Qt不同窗口类的控件信号和槽绑定
  • Excel 中如何实现数据透视表?
  • 复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration
  • NPM安装与配置全流程详解(2025最新版)
  • Python基础之threading多线程同时运行程序
  • 衣联网的商品列表页面结构是怎样的?
  • 前端项目中创建自动化部署脚本,用于 Jenkins 触发 npm run publish 来完成远程部署
  • 外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试
  • 爱普生可编程晶振SG-8200CJ特性与应用
  • Sentinel熔断降级
  • Seata简要说明
  • 《C#上位机开发从门外到门内》2-2:I2C总线协议及其应用详解
  • lua如何写出高性能的kong网关插件
  • ctf-web: php原生类利用 -- GHCTF Popppppp