java程序设计开发,设计思想开源框架-结构型模式之享元模式,运用共享技术支持大量细粒度对象,减少内存使用,提高性能
享元模式概述
定义
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。该模式旨在运用共享技术有效地支持大量细粒度的对象,将对象的状态分为内部状态和外部状态。内部状态是对象可共享的部分,存储在享元对象内部,不随环境变化;外部状态则依赖于使用场景,会根据环境变化而改变,由客户端保存并在需要时传递给享元对象。
核心角色
- 抽象享元角色(Flyweight):定义了享元对象的接口,声明了享元对象的操作方法,规定了内部状态和外部状态的使用方式。
- 具体享元角色(Concrete Flyweight):实现了抽象享元接口,负责存储内部状态,并根据客户端传入的外部状态进行相应操作。
- 享元工厂角色(Flyweight Factory):负责创建和管理享元对象。它维护一个享元对象池,当客户端请求享元对象时,先检查池中是否已存在符合要求的对象,若存在则直接返回,若不存在则创建新对象并放入池中。
- 客户端角色(Client):创建和管理外部状态,向享元工厂请求享元对象,并将外部状态传递给享元对象进行操作。
实际应用案例:围棋游戏
以下是一个简单的 Java 代码示例,模拟围棋游戏中棋子的共享:
import java.util.HashMap;
import java.util.Map;
// 抽象享元角色:棋子
interface ChessPiece {
void place(int x, int y);
}
// 具体享元角色:黑子
class BlackChessPiece implements ChessPiece {
@Override
public void place(int x, int y) {
System.out.println("在位置 (" + x + ", " + y + ") 放置黑子");
}
}
// 具体享元角色:白子
class WhiteChessPiece implements ChessPiece {
@Override
public void place(int x, int y) {
System.out.println("在位置 (" + x + ", " + y + ") 放置白子");
}
}
// 享元工厂角色:棋子工厂
class ChessPieceFactory {
private static final Map<String, ChessPiece> pieces = new HashMap<>();
public static ChessPiece getChessPiece(String color) {
ChessPiece piece = pieces.get(color);
if (piece == null) {
if ("black".equalsIgnoreCase(color)) {
piece = n