享元模式

来源:互联网 发布:linux lcd 设备文件 编辑:程序博客网 时间:2024/05/16 08:43

享元模式解决的问题是高效的支持大量细粒度对象的重用。这些被共享的对象放在享元池中,他们能被共享的关键在于区分了内部状态和外部状态。

可以设想,在围棋的系统中,众多的棋子,如果为每个棋子创建一个对象就太浪费内存了。其实黑棋或白棋的颜色和大小都不变(内部状态),变得只是显示的位置(外部状态)。

还是一样的,来看看享元模式的结构图吧:


将享元模式应用到围棋游戏中:


应注意,在这个系统中,棋子工厂是单例的,黑子和白子都是具体享元类,坐标类是辅助类。

以下则是代码的简单实现:

public class EleventhFlyweight {public static void main(String[] args) {// TODO Auto-generated method stubChessmanFactory fac = ChessmanFactory.getInstance();BlackChessman bc = (BlackChessman)fac.getChessman("b");WhiteChessman wc = (WhiteChessman)fac.getChessman("w");bc.display(new Coordinates(1,1));wc.display(new Coordinates(3,1));bc.display(new Coordinates(2,4));wc.display(new Coordinates(5,3));bc.display(new Coordinates(6,4));wc.display(new Coordinates(3,7));}}class ChessmanFactory{private static ChessmanFactory instance = new ChessmanFactory();private Hashtable<String,Chessman> chessmans = new Hashtable<String,Chessman>();private ChessmanFactory(){chessmans.put("b", new BlackChessman());chessmans.put("w", new WhiteChessman());}public static ChessmanFactory getInstance(){return instance;}public Chessman getChessman(String key){return chessmans.get(key);}}abstract class Chessman{public void display(Coordinates co){System.out.println(getColor()+"子在"+co.getX()+","+co.getY()+"显示");}public abstract String getColor();}class BlackChessman extends Chessman{public String getColor(){return "黑";}}class WhiteChessman extends Chessman{public String getColor(){return "白";}}class Coordinates{private int x;private int y;public Coordinates(int x,int y){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;}}

输出:

黑子在1,1显示白子在3,1显示黑子在2,4显示白子在5,3显示黑子在6,4显示白子在3,7显示

在java中,最常见的类String类就使用了享元模式,相同的字符串共享同一个内存区。

另外,享元模式又可以分为单纯享元模式和复合享元模式。以上例子就是单纯享元模式,复合享元模式的不同之处在于,单纯共享对象组成一个复合对象,这个复合对象不能共享。

ok,享元模式就这样吧。

0 0
原创粉丝点击