24.11.28
实验13:享元模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解享元模式的动机,掌握该模式的结构;
2、能够利用享元模式解决实际问题。
[实验任务一]:围棋
设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。
实验要求:
1.提交类图;
2.提交源代码;
3.注意编程规范;
4.要求用简单工厂模式和单例模式实现享元工厂类的设计。
- 类图:

- 源代码:
import java.util.HashMap;
import java.util.Map;
// 抽象棋子接口
interface ChessPiece {
void display(int x, int y); // 显示棋子及其位置
}
// 具体的黑棋类
class BlackChess implements ChessPiece {
@Override
public void display(int x, int y) {
System.out.println("黑棋位置:(" + x + ", " + y + ")");
}
}
// 具体的白棋类
class WhiteChess implements ChessPiece {
@Override
public void display(int x, int y) {
System.out.println("白棋位置:(" + x + ", " + y + ")");
}
}
// 享元工厂类(使用单例模式和简单工厂模式)
class ChessFactory {
private static ChessFactory instance; // 单例实例
private Map<String, ChessPiece> chessMap; // 享元池
// 私有构造方法,防止外部实例化
private ChessFactory() {
chessMap = new HashMap<>();
chessMap.put("black", new BlackChess());
chessMap.put("white", new WhiteChess());
}
// 获取工厂的单例实例
public static synchronized ChessFactory getInstance() {
if (instance == null) {
instance = new ChessFactory();
}
return instance;
}
// 简单工厂方法,根据类型获取棋子对象
public ChessPiece getChessPiece(String type) {
return chessMap.get(type.toLowerCase());
}
}
// 测试类
public class Main {
public static void main(String[] args) {
// 获取单例工厂实例
ChessFactory factory = ChessFactory.getInstance();
// 获取并使用黑棋对象
ChessPiece black1 = factory.getChessPiece("black");
ChessPiece black2 = factory.getChessPiece("black");
black1.display(1, 1);
black2.display(2, 2);
// 获取并使用白棋对象
ChessPiece white1 = factory.getChessPiece("white");
ChessPiece white2 = factory.getChessPiece("white");
white1.display(3, 3);
white2.display(4, 4);
// 验证是否是同一个对象
System.out.println("黑棋是否共享对象: " + (black1 == black2));
System.out.println("白棋是否共享对象: " + (white1 == white2));
}
}
浙公网安备 33010602011771号