image.png
在大型多人在线网页游戏中,存在大量的游戏角色。为了节省内存并提高性能,需要共享那些具有相同属性的角色对象,其他业务以此类推。
肖哥弹架构 跟大家“弹弹” 设计模式,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
2. 为什么要使用享元设计模式
享元模式通过共享通用对象来减少内存占用,对于大量相似对象的情况,可以显著提高系统资源的利用效率。
3. 标准享元设计模式图
image.png
4. 业务享元设计模式图
image.png
5. 业务代码参考
// 游戏角色接口
interface GameCharacter {
void move();
void attack();
void useItem(GameItem item);
}
// 具体享元角色:战士
class Warrior implements GameCharacter {
private GameItem weapon;
public Warrior(GameItem weapon) {
this.weapon = weapon;
}
@Override
public void move() {
// 战士移动逻辑
}
@Override
public void attack() {
// 战士攻击逻辑
}
@Override
public void useItem(GameItem item) {
if (item instanceof Weapon) {
this.weapon = item;
// 战士使用武器逻辑
}
}
}
// 具体享元角色:法师
class Mage implements GameCharacter {
private GameItem spellBook;
public Mage(GameItem spellBook) {
this.spellBook = spellBook;
}
@Override
public void move() {
// 法师移动逻辑
}
@Override
public void attack() {
// 法师攻击逻辑
}
@Override
public void useItem(GameItem item) {
if (item instanceof SpellBook) {
this.spellBook = item;
// 法师使用魔法书逻辑
}
}
}
// 游戏道具接口
interface GameItem {
void useBy(GameCharacter character);
}
// 具体游戏道具:武器
class Weapon implements GameItem {
private String name;
public Weapon(String name) {
this.name = name;
}
@Override
public void useBy(GameCharacter character) {
// 武器使用逻辑
}
}
// 具体游戏道具:魔法书
class SpellBook implements GameItem {
private String spell;
public SpellBook(String spell) {
this.spell = spell;
}
@Override
public void useBy(GameCharacter character) {
// 魔法书使用逻辑
}
}
// 享元工厂
class CharacterFactory {
private Map<String, GameCharacter> characters = new HashMap<>();
public GameCharacter getCharacter(String type, String intrinsicState) {
GameCharacter character = characters.get(intrinsicState + type);
if (character == null) {
switch (type) {
case "warrior":
character = new Warrior(new Weapon("Sword"));
break;
case "mage":
character = new Mage(new SpellBook("Fireball"));
break;
default:
throw new IllegalArgumentException("Unknown character type");
}
characters.put(intrinsicState + type, character);
}
return character;
}
}
// 客户端使用
class WebGame {
public static void main(String[] args) {
CharacterFactory factory = new CharacterFactory();
// 获取战士角色
GameCharacter warrior = factory.getCharacter("warrior", "001");
warrior.move();
warrior.attack();
// 获取法师角色
GameCharacter mage = factory.getCharacter("mage", "002");
mage.move();
mage.attack();
}
}
6. 使用享元设计模式的好处
- 节省内存:通过共享对象减少了内存中对象的数量。
- 提高性能:减少了对象创建和销毁的开销。
7. 其他使用享元设计模式场景参考
- 图形界面组件:如按钮、文本框等。
- 颜色管理:在图像处理软件中共享颜色对象。
8. 可参考开源框架
- Java 2D:Java 2D API使用享元模式来管理图形和图像对象。
总结
享元模式是一种提高系统性能和资源利用率的有效设计模式,特别适合于处理大量相似或相同对象的场景。
历史热点文章
- 外观模式(Facade Pattern):微服务架构中的数据库访问实战案例分析
- 代理模式(Proxy Pattern):权限校验API调用实战案例分析
- 桥接模式(Bridge Pattern):多样式用户界面组件实战案例分析
- 组合模式(Composite Pattern): 在线教育平台课程管理实战案例分析
- 享元模式(Flyweight Pattern):网页游戏中的角色对象管理实战案例分析
- 观察者模式(Observer Pattern):股票交易系统实战案例分析
- 策略模式(Strategy Pattern):电商平台的优惠券系统实战案例分析
- 模板方法模式(Template Method Pattern):视频播放应用实战案例分析
- 命令模式(Command Pattern):网络爬虫任务队列实战案例分析
- 迭代器模式(Iterator Pattern):电商平台商品分类浏览实战案例分析
- 中介者模式(Mediator Pattern):即时通讯软件实战案例分析
- 备忘录模式(Memento Pattern):游戏存档系统实战案例分析
- 状态模式(State Pattern):电商平台订单状态管理实战案例分析
- 责任链模式(Chain of Responsibility Pattern):电商平台的订单审批流程实战案例分析
- 访问者模式(Visitor Pattern):电商平台商品访问统计实战案例分析
- 工厂方法模式(Factory Method Pattern): 电商多种支付实战案例分析
- 抽象工厂模式(Abstract Factory Pattern):多风格桌面应用实战案例分析
- 建造者模式(Builder Pattern): 在线订单系统实战案例分析
- 原型模式(Prototype Pattern): 云服务环境配置实战案例分析
- 适配器模式(Adapter Pattern):第三方支付集成实战案例分析
- 装饰器模式(Decorator Pattern):电商平台商品价格策略实战案例分析
- 单例模式(Singleton Pattern):购物车实战案例分析