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

【玩转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.dtcms.com/a/62199.html

相关文章:

  • ArduPilot开源代码之AP_OSD_SITL
  • 使用TensorFlow 2构建并训练卷积神经网络(CNN)模型
  • sap关账+策略模式(避免大量if elseif)
  • LeetCode 513. 找树左下角的值 java题解
  • 《Spring日志整合与注入技术:从入门到精通》
  • 物理服务器抵御网络攻击的方法都有哪些?
  • SCSS详解
  • 创建模式-工厂方法模式(Factory Method Pattern)
  • UE5以插件的形式加载第三方库
  • AI+视频监控电力巡检:EasyCVR视频中台方案如何赋能电力行业智能化转型
  • 爬虫的精准识别:基于 User-Agent 的正则实现
  • 【RTSP】客户端(一):RTSP协议实现
  • 【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】
  • [Web]ServletContext域(Application)
  • 【Agent】Windows 和 CentOS 安装 Conda
  • wireguard搭配udp2raw部署内网
  • 坐落于杭州的电商代运营公司品融电商
  • 智能验证码破解:突破reCAPTCHA、Cloudflare和hCaptcha的全方位解决方案
  • selenium的鼠标操作
  • 每天一道算法题【蓝桥杯】【x的平方根】
  • 通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元
  • Qt5.10版本以下 qml ui语言动态切换
  • MySQL EXPLAIN 详解
  • 网络安全linux命令
  • CAAC无人机考证备考清单
  • 《用 python、MySQL 和 Chart.js 打造炫酷数据看板》实战案例笔记
  • SQLiteStudio:一款免费开源跨平台的SQLite管理工具
  • Kerckhoffs原理
  • 磁盘和文件系统
  • 【商城实战(23)】筑牢安全防线,防范常见漏洞