标签:
一.享元模式简介
如果有很多相同或者相似的对象可以使用享元模式,从而节约内存。
二.关键点
享元对象需要区分内部状态和外部状态。
内部状态:可以共享,不会随着外部状态改变。
外部状态:不可以共享,随外部状态改变。
享元共享类实现享元池管理享元对象。
三.简单实现
package com.lz.flyWeight; /* * 享元模式
* 内部状态 * 模拟棋盘,因为一盘棋其中棋子的颜色都一样 * 只有位置不一样,所以可以将颜色共享,这样可以节省内存空间 * 棋盘接口 */ interface Chess { void setColor(String c); String getColor(); void display(ChessLoc chess); } class ChessFlyWeight implements Chess { private String c; @Override public void setColor(String c) { this.c = c; } @Override public String getColor() { return this.c; } public ChessFlyWeight(String c) { super(); this.c = c; } @Override public void display(ChessLoc chess) { System.out.print("颜色:"+c+" "); System.out.print("坐标("+chess.getX()); System.out.println(","+chess.getY()+")"); } }
package com.lz.flyWeight; import java.util.HashMap; import java.util.Map; /* * 享元工厂类 */ public class FlyWeightFactory { /* * 享元池对象 */ private static Map<String, Chess> map = new HashMap<String, Chess>(); public static Chess getChess(String c) { if ( map.get(c) != null) { return map.get(c); } else { ChessFlyWeight chess = new ChessFlyWeight(c); map.put(c, chess); return chess; } } }
package com.lz.flyWeight; /* * 测试类 */ public class Client { public static void main(String[] args) { Chess tmp1 = FlyWeightFactory.getChess("黑"); Chess tmp2 = FlyWeightFactory.getChess("红色"); System.out.println(tmp1); System.out.println(tmp2); tmp1.display(new ChessLoc(1, 2)); tmp2.display(new ChessLoc(5, 4)); } }
package com.lz.flyWeight; /** * 位置信息 * 外部状态,不可共享 */ public class ChessLoc { private int x; private int y; public ChessLoc(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
四.总结
享元模式就是把对象相同相似的属性封装,不同的,变化的属性从外部传入,从而降低内存开销
标签:
原文地址:http://www.cnblogs.com/larobyo/p/5361598.html