享元模式实例五子棋 小鱼儿 2023-10-06 10:51 46阅读 0赞 享元模式,以共享的方式高效地支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。享元的英文是Flyweight,表示特别小的对象,即细粒度对象。 我们借用五子棋游戏来说明这一模式。 UML ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE1NzE5NjEz_size_16_color_FFFFFF_t_70] 代码: 创建抽象棋子一AbstractChessman package com.demo.flyweight.object; public abstract class AbstractChessman { // 棋子坐标 protected int x; protected int y; // 棋子类别(黑|白) protected String chess; public AbstractChessman(String chess) { this.chess = chess; } // 点坐标设置 public abstract void point(int x, int y); // 显示棋子信息 public void show() { System.out.println(this.chess + "(" + this.x + "," + this.y + ")"); } } 3.2 创建黑子一BlackChessman package com.demo.flyweight.object; public class BlackChessman extends AbstractChessman { /** * 构造方法 初始化黑棋子 */ public BlackChessman() { super("●"); System.out.println("--BlackChessman Construction Exec!!!"); } // 点坐标设置 @Override public void point(int x, int y) { this.x = x; this.y = y; // 显示棋子内容 show(); } } 3.3 创建白子一WhiteChessman package com.demo.flyweight.object; public class WhiteChessman extends AbstractChessman { /** * 构造方法 初始化白棋子 */ public WhiteChessman() { super("○"); System.out.println("--WhiteChessman Construction Exec!!!"); } // 点坐标设置 @Override public void point(int x, int y) { this.x = x; this.y = y; // 显示棋子内容 show(); } } 3.4 创建棋子工厂一FiveChessmanFactory package com.demo.flyweight.factory; import java.util.Hashtable; import com.demo.flyweight.object.AbstractChessman; import com.demo.flyweight.object.BlackChessman; import com.demo.flyweight.object.WhiteChessman; public class FiveChessmanFactory { // 单例模式工厂 private static FiveChessmanFactory fiveChessmanFactory = new FiveChessmanFactory(); // 缓存存放共享对象 private final Hashtable<Character, AbstractChessman> cache = new Hashtable<Character, AbstractChessman>(); // 私有化构造方法 private FiveChessmanFactory() { } // 获得单例工厂 public static FiveChessmanFactory getInstance() { return fiveChessmanFactory; } /** * 根据字符获得棋子 * * @param c * (B:黑棋 W:白棋) * @return */ public AbstractChessman getChessmanObject(char c) { // 从缓存中获得棋子对象实例 AbstractChessman abstractChessman = this.cache.get(c); if (abstractChessman == null) { // 缓存中没有棋子对象实例信息 则创建棋子对象实例 并放入缓存 switch (c) { case 'B': abstractChessman = new BlackChessman(); break; case 'W': abstractChessman = new WhiteChessman(); break; default: break; } // 为防止 非法字符的进入 返回null if (abstractChessman != null) { // 放入缓存 this.cache.put(c, abstractChessman); } } // 如果缓存中存在 棋子对象则直接返回 return abstractChessman; } } 3.5 客户端实现一Client package com.demo; import java.util.Random; import com.demo.flyweight.factory.FiveChessmanFactory; import com.demo.flyweight.object.AbstractChessman; /** * 主应用程序 * * @author */ public class Client { /** * @param args */ public static void main(String[] args) { // 创建五子棋工厂 FiveChessmanFactory fiveChessmanFactory = FiveChessmanFactory .getInstance(); Random random = new Random(); int radom = 0; AbstractChessman abstractChessman = null; // 随机获得棋子 for (int i = 0; i < 10; i++) { radom = random.nextInt(2); switch (radom) { // 获得黑棋 case 0: abstractChessman = fiveChessmanFactory.getChessmanObject('B'); break; // 获得白棋 case 1: abstractChessman = fiveChessmanFactory.getChessmanObject('W'); break; } if (abstractChessman != null) { abstractChessman.point(i, random.nextInt(15)); } } } } 1. 运行结果 --WhiteChessman Construction Exec!!! ○(0,2) ○(1,6) --BlackChessman Construction Exec!!! ●(2,3) ○(3,14) ○(4,13) ○(5,8) ●(6,14) ●(7,0) ●(8,3) ○(9,8) [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE1NzE5NjEz_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20200611113806937.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE1NzE5NjEz,size_16,color_FFFFFF,t_70
相关 简易理解设计模式之:享元模式——五子棋游戏例子 介绍: > 享元模式是一种结构型模式。它的定义为:使用共享对象可有效地支持大量的细粒度的对象。 两个概念 • 内部状态:不会随环境的改变而改变,可以共享的相同内容 快来打我*/ 2023年10月07日 11:53/ 0 赞/ 24 阅读
相关 享元模式实例五子棋 享元模式,以共享的方式高效地支持大量的细粒度对象。通过复用内存中已存在的对象,降低系统创建对象实例的性能消耗。享元的英文是Flyweight,表示特别小的对象,即细粒度对象。 小鱼儿/ 2023年10月06日 10:51/ 0 赞/ 47 阅读
相关 享元模式 享元模式(Flyweight),就是运用共享技术有效地支持大量细粒度的对象。 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(Externa 冷不防/ 2022年06月16日 23:20/ 0 赞/ 192 阅读
相关 享元模式 1.使用场景: 内存资源比较稀缺,不要随便浪费,如果有很多相同或者类似的对象,通过使用享元模式的方法,节省内存,例如线程池以及String类等。 2.UML表示 悠悠/ 2022年05月31日 09:49/ 0 赞/ 177 阅读
相关 享元模式 定义 享元模式:运用共享技术有效的支持大量细粒度的对象。 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太 向右看齐/ 2022年05月14日 12:15/ 0 赞/ 26 阅读
相关 享元模式 享元模式 一、概述 1. 内存属于稀缺资源,不要随便浪费。如果有很多个完全相同或相似的 对象,我们可以通过享元模式,节省内存。 2. 享元模式以共享的方式高效地 忘是亡心i/ 2022年04月18日 04:55/ 0 赞/ 191 阅读
相关 享元模式 [享元模式][Link 1] 模式说明 所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现 ゝ一世哀愁。/ 2021年11月23日 06:46/ 0 赞/ 245 阅读
相关 享元模式 当系统中出现大量相同、相似的对象时,会导致系统性能下降。享元模式通过共享技术对相同或相似对象进行重用,从而解决这一问题。在享元模式中,存储共享实例对象的地方称为享元池 (Fly 怼烎@/ 2021年11月11日 10:50/ 0 赞/ 290 阅读
相关 享元模式 12.享元模式 我们可以共用一个 Hello world 对象,其中字符串 “Hello world” 为内部状态,可共享;字体颜色为外部状态,不可共享,由 逃离我推掉我的手/ 2021年09月17日 00:00/ 0 赞/ 281 阅读
相关 享元模式 元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的... 小灰灰/ 2020年06月13日 05:55/ 0 赞/ 451 阅读
还没有评论,来说两句吧...