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

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

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

一、简介

  享元模式(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或道具。
  • 文本编辑器:共享字符对象以减少内存消耗。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值