享元模式是一种结构型模式,它通过共享相同的对象来减少内存消耗,适用于大量细粒度对象的场景。关键思想是缓存重复出现的对象,避免重复创建。
public interface ChessPiece {
void display(String position);
}
public class BlackChess implements ChessPiece {
@Override
public void display(String position) {
System.out.println("⚫ 黑棋,位置:" + position);
}
}
public class WhiteChess implements ChessPiece {
@Override
public void display(String position) {
System.out.println("⚪ 白棋,位置:" + position);
}
}
import java.util.HashMap;
import java.util.Map;
public class ChessFactory {
private static final Map cache = new HashMap<>();
public static ChessPiece getChess(String color) {
ChessPiece piece = cache.get(color);
if (piece == null) {
if (color.equalsIgnoreCase("black")) {
piece = new BlackChess();
} else if (color.equalsIgnoreCase("white")) {
piece = new WhiteChess();
}
cache.put(color, piece);
}
return piece;
}
}
public class Client {
public static void main(String[] args) {
ChessPiece black1 = ChessFactory.getChess("black");
ChessPiece black2 = ChessFactory.getChess("black");
ChessPiece white1 = ChessFactory.getChess("white");
black1.display("A1");
black2.display("B2");
white1.display("C3");
System.out.println("black1 与 black2 是否为同一对象?" + (black1 == black2)); // true
}
}
大量相似对象可以复用,节省内存,提升性能
将共享与非共享状态区分清晰,结构更清晰
系统逻辑变复杂,需要区分内部与外部状态
不适合对象差异性大的情况
适用于如下情况:
游戏对象池(如子弹、精灵)
数据库连接池、线程池
文本编辑器中的字体对象共享