GoF设计模式(十二) - 享元模式
前言
享元模式(Flyweight Pattern)运用共享技术有效地支持大量细粒度的对象,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
模式所涉及的角色
- Flyweight: 享元接口,通过这个接口传入外部状态并作用于外部状态;
- ConcreteFlyweight: 具体的享元实现对象,必须是可共享的,需要封装享元对象的内部状态;
- UnsharedConcreteFlyweight: 非共享的享元实现对象,并不是所有的享元对象都可以共享,非共享的享元对象通常是享元对象的组合对象;
- FlyweightFactory: 享元工厂,主要用来创建并管理共享的享元对象,并对外提供访问共享享元的接口
模式实现
以五子棋/围棋做示例
- 棋子(ChessPieces)类是抽象享元角色,它包含了一个落子的 DownPieces(Graphics graphics,Point point,Color color) 方法;
- 具体棋子(WeiQiPieces)类是具体享元角色,它实现了落子方法;
- ChessGameFactory 是享元工厂角色,它通过 hashMap 来管理棋子,并且提供了获取白子或者黑子的 getChessPieces(Color color) 方法;
- 客户类(Chessboard)利用 Graphics 组件在框架窗体中绘制一个棋盘,并实现 mouseClicked(MouseEvent e) 事件处理方法,该方法根据用户的选择从享元工厂中获取白子或者黑子并落在棋盘上
代码实现
棋子与具体棋子
public interface ChessPieces {/*** 下子** @param graphics 绘制* @param point 坐标*/void downPieces(Graphics graphics, Point point, Color color);
}
public class WeiQiPieces implements ChessPieces {@Overridepublic void downPieces(Graphics graphics, Point point, Color color) {graphics.setColor(color);graphics.fillOval(point.x, point.y, 30, 30);}
}
棋子工厂
public class ChessGameFactory {private final Map<Color,ChessPieces> chessPiecesMap = new HashMap<>();public ChessPieces getChessPieces(Color color) {ChessPieces chessPieces = chessPiecesMap.get(color);if(chessPieces == null){chessPiecesMap.put(color, new WeiQiPieces());}return chessPiecesMap.get(color);}
}
棋盘及启动类
public class ChessBoard extends MouseAdapter {private final ChessGameFactory chessGameFactory = new ChessGameFactory();private final Graphics graphics;private final JRadioButton whiteChess;private final JRadioButton blackChess;private final int x = 50;private final int y = 50;/*** 小方格宽度和高度*/private final int w = 40;/*** 棋盘宽度和高度*/private final int rw = 400;public ChessBoard(){JPanel southJp = new JPanel();whiteChess = new JRadioButton("白子");blackChess = new JRadioButton("黑子", true);ButtonGroup group = new ButtonGroup();group.add(whiteChess);group.add(blackChess);southJp.add(whiteChess);southJp.add(blackChess);JFrame jFrame = new JFrame("享元模式在围棋游戏中的简单应用");Container cont = jFrame.getContentPane();cont.add(southJp);jFrame.setSize(500, 500);jFrame.setVisible(true);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel centerJp = new JPanel();centerJp.setLayout(null);centerJp.setSize(800, 800);centerJp.addMouseListener(this);jFrame.add("Center", centerJp);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}graphics = centerJp.getGraphics();graphics.setColor(Color.BLUE);graphics.drawRect(x, y, rw, rw);for (int i = 1; i < 10; i++) {//绘制第i条竖直线graphics.drawLine(x + (i * w), y, x + (i * w), y + rw);//绘制第i条水平线graphics.drawLine(x, y + (i * w), x + rw, y + (i * w));}}@Overridepublic void mouseClicked(MouseEvent e) {Point pt = new Point(e.getX() - 15, e.getY() - 15);if (whiteChess.isSelected()) {ChessPieces c1 = chessGameFactory.getChessPieces(Color.white);c1.downPieces(graphics, pt, Color.white);} else if (blackChess.isSelected()) {ChessPieces c2 = chessGameFactory.getChessPieces(Color.black);c2.downPieces(graphics, pt, Color.black);}}public static void main(String[] args) {new ChessBoard();}}
运行效果
源码
https://download.csdn.net/download/javanbme/80098289
GoF设计模式(十二) - 享元模式相关推荐
- 设计模式(十)享元模式Flyweight(结构型)
设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...
- 设计模式十二之组合模式
设计模式十二之组合模式 1. 模式的定义与特点 1.1 模式的定义 1.2 模式的特点 1.3 模式的使用场景 2. 模式的结构与实现 2.1 模式的结构 2.2 模式的实现 3. 模式在开源软件中的 ...
- 结构型设计模式(五) 之 享元模式是池技术的表现
1 定义 享元模式(Flyweight Pattern)属于结构型设计模式之一,它主要是使用共享对象有效地避免了创建过多的性质相近的对象,从而降低内存的占用,提高程序的性能.它也是池技术的重要实现方式 ...
- C#设计模式之十一享元模式(Flyweight Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第六个模式,该模式是[享元模式],英文名称是:Flyweight Pattern.还是老套路,先从名字上来看看."享元"是不是可以这样理解 ...
- Net设计模式实例之享元模式( Flyweight Pattern)
一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...
- Java描述设计模式(18):享元模式
本文源码:GitHub·点这里 || GitEE·点这里 一.使用场景 应用代码 public class C01_InScene {public static void main(String[] ...
- 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- java23设计模式---class10、享元模式(FlyWeight)
文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...
- 《研磨设计模式》chap20 享元模式 Flyweight (4)总结
1. 不共享的外部状态 输入数据为: 张三,人员列表,查看,1 李四,人员列表,查看,1 李四,操作薪资数据,2 " 操作薪资数据"包括"薪资数据,查看",&q ...
最新文章
- HNUSTOJ-1674 水果消除(搜索或并查集)
- stm32 内部sram大小_STM32第三天
- SAP ABAP实用技巧介绍系列之已知某个signature查找定义的方法
- 编程基本功:有了范例代码,怎么办?
- 简单明了 - Git 使用超详细教程
- 应对游戏业务的四大“崩溃”场景有妙招,安全畅玩不是梦!
- 新疆师范大学计算机研究生值得读吗,研究生还值得读吗
- Windows Media Player单例模式
- Group by的使用方法
- jQuery源码06-jQuery = function(){};给JQ对象,添加一些方法和属性,extend : JQ的继承方法,jQuery.extend()...
- Hi3559AV100移植友方4G模块N720V5(二)
- 利用定义式求圆锥曲线方程
- JavaScript函数传参原理详解——值传递还是引用传递
- DevOps平台的“精益创业”之路
- 计算机做课程表教程,初学表格制作教程 初学者如何制作课程表
- 线性代数学习笔记——n维向量
- Ubuntu18.04系统的安装及使用,不能开机,输入法不对等
- 单片机c语言中tr=0的意思,单片机C语言#define RS_CLR RS=0 什么意思?
- 【20211008】为什么分布式服务框架越来越火
- 安保巡更室内外定位系统解决方案
热门文章
- 芯片验证漫游指南-读书笔记
- Java代码防止被反编译的4中方法
- PC串口状态监视软件
- html网页设计期末大作业——绿色化妆品网页设计(4页)
- VMware Workstation 17.0 Pro Unlocker OEM BIOS for Windows
- [附源码]Python计算机毕业设计SSM即刻实时预约排队系统(程序+LW)
- JavaScript 高级程序设计第二章
- CC2541修改蓝牙名称为中文名称
- word自带公式编辑_Word公式编辑器下载_Word公式编辑器官方下载-太平洋下载中心...
- powerbuilder