享元模式
来源:互联网 发布: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
- 深入浅出享元模式
- 享元模式
- 享元(FlyWeight)模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式Flyweight
- 享元模式
- 享元模式
- 享元模式
- FlyWeight 享元模式
- 享元模式(Flyweight)
- 享元模式
- 享元模式
- 享元模式
- 享元模式
- 享元模式 ---flyweight
- zigbee中profile,cluster的认识【转】
- 消息中心 NSNotificationCenter
- iphone导航条的显示与隐藏
- SAX和DOM解析XML文档
- sql插入某些固定数据和其他子查询结果
- 享元模式
- 一篇%3CDIV%20style%3D%22FONT-SIZE%
- Java反射学习总结二(用反射调用对象的私有属性和方法)
- 关于Images.xcassets
- hdu 3038 How Many Answers Are Wrong(并查集)
- Android开发之手机拍照功能的实现(源代码分享)
- Unable to open log device ‘/dev/log/main’: No such file or directory
- vi的使用
- SSH+Oracle整合开发错误8 ,,,关于数据库的问题