天天看点

享元模式的一些理解和实例

记录下自己的学习过程,谈谈自己的理解,欢迎指正和交流。

最近在看设计模式,先说说享元模式吧,在我看来享元模式本质就是将大量的相似的对象的公共的不会变化的部分抽象出来,作为静态变量,作为全局唯一的对象,让所有的对象共同使用这一组对象,达到节约内存的目的。

举一个例子来说明,在一个象棋游戏中,每个对局都会有一个棋局对象,同时在线可能会有成千上万的棋局对象,每个棋局又有多个对象,那就需要数万乃至数十万的棋子对象,这样就会对内存造成极大的消耗,影响程序性能。但是在每个棋局中的棋子的种类、颜色等属性都是固定不变的,不同的两个棋局中的棋子对象的区别就只是属于不同的棋局和拥有不同坐标,因此可以创建一个模板棋局,其中包含所有的棋子对象,将这个对象定义成一个静态变量,以后新增的棋局对象都可以使用这个棋局对象作为模板,共享使用这个棋局和其中的棋子对象,只需要在不同的棋局中修改棋子的坐标即可。代码如下

//棋子享元类,不同棋盘中不同坐标的棋子的相同的属性对象。
public class ChessUnit {
	public int id;
	public String color;
	public String chessName;
	
	public ChessUnit (int id, String color, String chessName) {
		this.id = id;
		this.color = color;
		this.chessName = chessName;
	}
}
//真正的棋子类
public class Chess {
	private ChessUnit chessUnit;
	private int x;
	private int y;
	public Chess(ChessUnit chessUnit, int x, int y){
		this.chessUnit = chessUnit;
		this.x = x;
		this.y = y;
	}

}
//提供一个工厂类,保存不变的那些固定的不变的要被共享的享元对象,用静态对象保存
public class ChessUnitFactory {
	
	private static final  Map<Integer, ChessUnit>  chesses = new HashMap<Integer, ChessUnit>();
	
	static {
		chesses.put(1, new ChessUnit(1, "red", "马"));
		chesses.put(2, new ChessUnit(1, "red", "将"));
		chesses.put(3, new ChessUnit(1, "red", "士"));
		chesses.put(4, new ChessUnit(1, "red", "象"));	
	}
	public static ChessUnit getChessByid(int chessId){
		return chesses.get(chessId);
	}

}
//一个棋盘类,在构造方法中调用init方法,利用保存好的静态变量来初始化对象,节约内存空间。
public class ChessBoard {
	
	private Map<Integer, Chess> chessBoard = new HashMap<Integer, Chess>();
	
	public	ChessBoard(){
		init();
	}
	
	public void init() {
		chessBoard.put(1, new Chess(ChessUnitFactory.getChessByid(1),123,32));
		chessBoard.put(2, new Chess(ChessUnitFactory.getChessByid(2),123,32));
		chessBoard.put(3, new Chess(ChessUnitFactory.getChessByid(3),123,32));
		chessBoard.put(4, new Chess(ChessUnitFactory.getChessByid(4),123,32));
	}
}