ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java设计模式之享元模式

2022-02-01 21:00:26  阅读:158  来源: 互联网

标签:享元 java int private 棋子 static new 设计模式 public


享元顾名思义共享单元

比如在网上围棋游戏中,可能同时有很多人在下棋,每个棋局一个棋盘+N个棋子。

如果有一百万人同时在线,每个棋局数百个棋子,那就需要上亿的棋子对象,这个显然是一种浪费。

因为棋子非黑即白,没有什么变化,这些棋子在不同的棋盘都可以共享的

我们首先定义一个棋子类,它只有颜色一个属性

public enum Color {
    WHITE,
    BLACK;
}

我们定义一个棋子类,它有颜色和ID两个属性

/**
 * 围棋棋子
 */
public class GoPiece {

    private Color color;
    private Integer id;

    public  GoPiece(Color color, Integer id) {
        this.color = color;
        this.id = id;
    }
}

 

在一个围棋棋盘上,每个棋子都是不同的,所以我们需要给围棋棋子定义一个ID,黑子共181个,白子180个,我们定义一个工厂类来生成

/**
 * 围棋棋子工厂类
 */
public class GoPieceFactory {
    private static final int blackNum=181;
    private static final int whiteNum=180;
    private static final List<GoPiece> blackPieces = new ArrayList<>();
    private static final List<GoPiece> whitePieces = new ArrayList<>();

    static {
        for (int i = 0; i < blackNum; i++) {
            blackPieces.add(i, new GoPiece(Color.BLACK, i));
        }
        for (int j = 0; j < whiteNum; j++) {
            whitePieces.add(j, new GoPiece(Color.WHITE, j));
        }
    }

    public static GoPiece getWhite() {
        Random random = new Random();
        int i = random.nextInt(whiteNum);
        return whitePieces.get(i);
    }

    public static GoPiece getBlack() {
        Random random = new Random();
        int i = random.nextInt(blackNum);
        return blackPieces.get(i);
    }
}

接下来就可以下棋了

/**
 * 围棋游戏
 */
public class GoGame {
    private Table<Integer,Integer,GoPiece> board= HashBasedTable.create();

    public GoGame() {
       init();
    }

    private void init(){
        board.put(0,0,GoPieceFactory.getBlack());//执黑先行
        board.put(0,1,GoPieceFactory.getWhite());
        board.put(1,1,GoPieceFactory.getBlack());
        //...
    }
}

不管有多少棋局同时在线,棋子就是工厂里这361个对象。相对于上亿的对象,极大减少了内存空间的使用。

 

标签:享元,java,int,private,棋子,static,new,设计模式,public
来源: https://www.cnblogs.com/wangbin2188/p/15859616.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有