实现对象的复用——享元模式(三):围棋棋子的解决方案
来源:互联网 发布:photoshop mac版破解 编辑:程序博客网 时间:2024/04/30 12:53
14.3 完整解决方案
为了节约存储空间,提高系统性能,Sunny公司开发人员使用享元模式来设计围棋软件中的棋子,其基本结构如图14-4所示:
在图14-4中,IgoChessman充当抽象享元类,BlackIgoChessman和WhiteIgoChessman充当具体享元类,IgoChessmanFactory充当享元工厂类。完整代码如下所示:
import java.util.*; //围棋棋子类:抽象享元类 abstract class IgoChessman { public abstract String getColor(); public void display() { System.out.println("棋子颜色:" + this.getColor()); } } //黑色棋子类:具体享元类 class BlackIgoChessman extends IgoChessman { public String getColor() { return "黑色"; } } //白色棋子类:具体享元类 class WhiteIgoChessman extends IgoChessman { public String getColor() { return "白色"; } } //围棋棋子工厂类:享元工厂类,使用单例模式进行设计 class IgoChessmanFactory { private static IgoChessmanFactory instance = new IgoChessmanFactory(); private static Hashtable ht; //使用Hashtable来存储享元对象,充当享元池 private IgoChessmanFactory() { ht = new Hashtable(); IgoChessman black,white; black = new BlackIgoChessman(); ht.put("b",black); white = new WhiteIgoChessman(); ht.put("w",white); } //返回享元工厂类的唯一实例 public static IgoChessmanFactory getInstance() { return instance; } //通过key来获取存储在Hashtable中的享元对象 public static IgoChessman getIgoChessman(String color) { return (IgoChessman)ht.get(color); } }
编写如下客户端测试代码:
class Client { public static void main(String args[]) { IgoChessman black1,black2,black3,white1,white2; IgoChessmanFactory factory; //获取享元工厂对象 factory = IgoChessmanFactory.getInstance(); //通过享元工厂获取三颗黑子 black1 = factory.getIgoChessman("b"); black2 = factory.getIgoChessman("b"); black3 = factory.getIgoChessman("b"); System.out.println("判断两颗黑子是否相同:" + (black1==black2)); //通过享元工厂获取两颗白子 white1 = factory.getIgoChessman("w"); white2 = factory.getIgoChessman("w"); System.out.println("判断两颗白子是否相同:" + (white1==white2)); //显示棋子 black1.display(); black2.display(); black3.display(); white1.display(); white2.display(); } }
编译并运行程序,输出结果如下:
判断两颗黑子是否相同:true判断两颗白子是否相同:true棋子颜色:黑色棋子颜色:黑色棋子颜色:黑色棋子颜色:白色棋子颜色:白色
从输出结果可以看出,虽然我们获取了三个黑子对象和两个白子对象,但是它们的内存地址相同,也就是说,它们实际上是同一个对象。在实现享元工厂类时我们使用了单例模式和简单工厂模式,确保了享元工厂对象的唯一性,并提供工厂方法来向客户端返回享元对象。
【作者:刘伟 http://blog.csdn.net/lovelion】
0 0
- 实现对象的复用——享元模式(三):围棋棋子的解决方案
- 【怎样写代码】实现对象的复用 -- 享元模式(三):享元模式
- 实现对象的复用——享元模式(三)
- 实现对象的复用——享元模式(三)
- 实现对象的复用——享元模式(三)
- 实现对象的复用——享元模式(四):带外部状态的解决方案
- 【怎样写代码】实现对象的复用 -- 享元模式(二):解决方案
- 实现对象的复用——享元模式
- 实现对象的复用——享元模式
- 实现对象的复用——享元模式
- 实现对象的复用——享元模式
- 实现对象的复用——享元模式(一):享元模式概述(上)
- 实现对象的复用——享元模式(二):享元模式概述(下)
- 实现对象的复用——享元模式(五):单纯、复合享元模式,享元模式总结
- 实现对象的复用--享元模式(Flyweight)
- 实现对象的复用——享元模式(一)
- 实现对象的复用——享元模式(二)
- 实现对象的复用——享元模式(四)
- html+js图片上传预览
- python常见的错误类型和继承关系
- SVN版本冲突,遇到<<<<<<< .mine,=======,>>>>>>>.r3541怎么解决?
- flume实际应用架构图
- 操作系统常见面试题总结
- 实现对象的复用——享元模式(三):围棋棋子的解决方案
- PCA主成分分析
- python新手必碰到的问题---encode与decode,中文乱码
- jdk1.4版本没有 java.lang.UUID
- android-Providing Ancestral and Temporal Navigation,Putting it All Together: Wireframing the Example
- TestNg测试报告美化
- 微信公众平台开发入门教程2
- activity 中的 onSaveInstanceState方法的调用时机
- Android连续点两下Back退出程序