24.11.28

实验13:享元模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解享元模式的动机,掌握该模式的结构;

2、能够利用享元模式解决实际问题。

 

[实验任务一]:围棋

设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。

实验要求:

1.提交类图;

2.提交源代码;

3.注意编程规范;

4.要求用简单工厂模式和单例模式实现享元工厂类的设计。

 

  1. 类图:

 

 

  1. 源代码:

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));

    }

}

posted on 2024-11-28 19:56  Daniel350  阅读(16)  评论(0)    收藏  举报