享元模式Flyweight
创始人
2024-03-13 10:12:23
0

1.意图:运用共享技术有效地支持大量细粒度的对象。
2.结构
在这里插入图片描述

描述一个接口,通过这个接口Flyweight可以接受并作用于外部状态;
ConcreteFlyweight实现Flyweight接口,并为内部状态(如果有)增加存储空间。ConreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景;
并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子结点;
FlyweightFactory创建并管理Flyweight对象;确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory对象提供一个已创建的实例或者在不存在时创建一个实例;
Client维持一个对Flyweight的引用,计算或存储一个或多个Flyweight的外部状态。
3.适用性:
一个应用程序使用了大量的对象;
完全由于使用大量的对象,造成了很大的存储开销;
对象的大多数状态都可变为外部状态;
如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象;
应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
代码案例
享元模式主要用于减少创建对象的数量,以低内存占用,提高性能。开发一个网络围棋程序允许多个玩家联机下棋。由于只有一台服务器,为节省内存空间,采用享元模式实现该程序。

import java.util.ArrayList;
/*** 享元模式*/
public class FlyWeight {public static void main(String[] args) {PieceBoard board = new PieceBoard("张三","李四");PiecePos pos1 = new PiecePos(4,6);board.setPiect(PieceColor.BLACK,pos1);PiecePos pos2 = new PiecePos(2,6);board.setPiect(PieceColor.WHITE,pos2);}
}
enum PieceColor{BLACK,WHITE}//棋子颜色
class PiecePos{//棋子位置private int x;private int y;public PiecePos(int a ,int b){x = a;y = b;}public int getX(){return x;}public int getY(){return y;}
}
abstract class Piece{//棋子定义protected PieceColor m_color;//颜色protected PiecePos m_pos;//位置public Piece(PieceColor color,PiecePos pos){m_color = color;m_pos = pos;}public abstract void draw();
}
class BlackPiece extends Piece{public BlackPiece(PieceColor color, PiecePos pos) {super(color, pos);}@Overridepublic void draw() {System.out.println("draw a blackPiece");}
}
class WhitePiect extends Piece{public WhitePiect(PieceColor color, PiecePos pos) {super(color, pos);}@Overridepublic void draw() {System.out.println("draw a whitePiece");}
}
class PieceBoard{//棋盘上已有的棋子private static final ArrayList m_arrayPiece = new ArrayList<>();private String m_blackName;//黑方名称private String m_whiteName;//白方名称public PieceBoard (String black,String white){m_blackName = black;m_whiteName = white;}//一步棋,在棋盘上放一个棋子public void setPiect(PieceColor color, PiecePos pos){Piece piece = null;if(color == PieceColor.BLACK){//放黑子piece = new BlackPiece(color,pos);//获取一颗黑子System.out.println(m_blackName+"放在位置("+pos.getX()+","+pos.getY()+")");piece.draw();}else{//放白子piece = new BlackPiece(color,pos);//获取一颗白子System.out.println(m_whiteName+"放在位置("+pos.getX()+","+pos.getY()+")");piece.draw();}m_arrayPiece.add(piece);}
}

运行结果
在这里插入图片描述

相关内容

热门资讯

三部门发文:完善幼儿园收费政策 12月23日,由国家发展改革委、教育部、财政部联合印发的《关于完善幼儿园收费政策的通知》(以下简称《...
三部门联合发布2025年劳动法... 中新网12月25日电 据最高人民检察院微信公众号25日消息,中华全国总工会、最高人民法院、最高人民检...
金融领域“黑灰产”违法犯罪集群... 海报新闻记者 孙佃潇 北京报道 12月25日,公安部召开新闻发布会,会上通报公安部和国家金融监督管理...
最高法、全国妇联、司法部联合发... 人民网北京12月25日电 (薄晨棣、高清扬)据最高人民法院消息,24日,最高法与全国妇联、司法部联合...
200余个金融领域犯罪团伙被警... 文 | CFN 大河 图 | 微摄 2025年12月25日,公安部在京召开专题新闻发布会,通报了一场...
锐评丨套牌电动车,闯了法律红灯 一辆在昌平被烧毁的电动车,却在朝阳出现交通违法记录;车牌早已注销,仍收到交通违法提示短信;人在国外度...
金融领域“黑灰产”行为法律关系... 新京报讯(记者张建林)今年6月至11月,公安部会同国家金融监管总局部署17个重点省市开展为期6个月的...
比亚迪起诉“龙哥讲电车”一审胜... 12月25日,比亚迪法务部公布,就起诉自媒体账号“龙哥讲电车”、“满格电新能源”等一案,已收到法院一...
广州首个游戏电竞产业专项扶持政... 钛媒体App 12月25日消息,《广州市扶持游戏电竞产业发展的十八条措施》在广州市人民政府官网正式发...