创建大量相似实例。耗费资源。如,黑白棋子,教室里桌子和凳子等。相同分提取共享
一、定义与特点
多个“虚拟”实例,共享技术支持,大量细粒度对象,
优点:避免大量相似类,提高利用率。
缺点:不共享状态外部化,增加复杂性。
读取享元模式的外部状态会使运行时间长。
二、结构与实现
内部状态:不改变,可共享部分;
外部状态:随环境变,不共享部分。外部状态外部化。
1. 模式的结构
抽象享元(Flyweight):基类,公共接口
具体享元(Concrete Flyweight):实现抽象享元接口。
非享元(Unsharable Flyweight):外部状态,参数形式注入具体享元
享元工厂(Flyweight Factory):创建和管理享元。请求享元对象,检査系统中是否存符合要求,不存在,创建。客户通过享元工厂获取具体享元
图1 享元模式的结构图
具体享元角色
享元工厂角色
三、应用实例
抽象享元:棋子(ChessPieces)
具体享元:白子(WhitePieces)和黑子(BlackPieces)
非享元角色:Point落子位置
享元工厂:WeiqiFactory
通过 ArrayList 来管理棋子,提供了获取白子或者黑子getChessPieces(String type) 方法;
客户类(Chessboard)利用 Graphics 绘制棋盘,实现 mouseClicked(MouseEvent e) 从享元工厂中获取白子或者黑子并落在棋盘上。
享元工厂
棋盘
棋盘
四、扩展
(1) 单纯享元
具体享元类可以共享,不存在非共享
(2) 复合享元模式
享元模式中有单纯享元。不能共享,分解成单纯享元再共享
图5 复合享元模式的结构图