学习设计模式之享元模式,但是宝可梦

前言

作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。

享元模式

1 介绍

享元模式很好理解,它主要是为了减少创建对象的数量,属于结构型设计模式

  • 目的:减少创建对象的次数
  • 方法:复用对象
  • 何时使用:系统大量需要对象,该创建对象的消耗很大

享元模式有3个角色:

  • 抽象享元类(Flyweight):声明享元类的公共方法
  • 具体享元对象(Concrete Flyweight):抽象享元类的具体实现
  • 享元工厂类(Flyweight Factory):创建、管理享元对象。

还是老样子,一上来一堆概念和角色名次,如果不熟悉线程池的读者朋友,或许还是云里雾里。

那么,进入宝可梦世界。

2 情景模拟

在这里插入图片描述

玩过宝可梦的读者都知道,一场战斗开始之前,双方都要携带一定数量的宝可梦,当一方所有宝可梦都战斗不能时,就被判负。

每个回合也可以选择继续出招或者收回宝可梦,如果选择收回,那下次放出来的时候,还是会延续收回之前的状态,因为收回后再拿出来很明显是对同一个宝可梦进行的,皮卡丘收回去之后,这个精灵球里下次出来的还是皮卡丘,而且是收回来的皮卡丘,不是一个满血满状态的。

那么享元模式工厂维护的“享元池”,就有对象第一次创建的时机,可以是第一次使用的时候。

那么一场战斗携带的精灵就是复用的,这也可以引出享元模式的角色:

  • 抽象享元类:宝可梦,定义了公共方法,如登场,掉血
  • 具体享元类:具体的宝可梦
  • 享元工厂类:一场战斗的精灵包,维护全体精灵这个享元池

3 代码

抽象类

/*** 宝可梦抽象类* 对应抽象享元类* Flyweight*/
public interface Pokemon {/*** 宝可梦出场*/void go();/*** 宝可梦在战斗中损失HP* @param damage HP*/void loseHP(Integer damage);
}

具体类

/*** 宝可梦具体实现类* 对应具体享元类* ConcreteFlyweight*/
public class ConcretePokemon implements Pokemon{String name;Integer hp = 100;public ConcretePokemon(String name) {this.name = name;}@Overridepublic void go() {System.out.println("去吧!" + this.name + "! (HP:" + this.hp + ")");}@Overridepublic void loseHP(Integer damage) {this.hp -= damage;}
}

享元工厂

/*** 模拟一场战斗的精灵背包* 对应享元工厂类* FlyweightFactory*/
public class FlyweightFactory {// 用一个哈希表判断对象是否存在private HashMap<String, Pokemon> pokemonPool = new HashMap<>();/*** 获取宝可梦,如果没有出场过,就创建对象* 出场过的就返回之前创建的对象* @param name* @return*/public Pokemon getPokemon(String name){// 用名字获取对象 存在就取出 不存在就创建后存入哈希表if(!pokemonPool.containsKey(name)){pokemonPool.put(name, new ConcretePokemon(name));}Pokemon pokemon = pokemonPool.get(name);pokemon.go();return pokemon;}
}

测试类

模拟一场宝可梦战斗,两位训练家小智satoshi和小茂shigeru分别维护各自的享元池,第一次派出精灵时,创建对象。第一回合战斗中,皮卡丘掉血50。第二回合,小智任然派出皮卡丘,可以看到,皮卡丘还是只有50血,因为是同一个对象

public class FlyWeightDemo {public static void main(String[] args) {// 用工厂模拟2位对战训练家FlyweightFactory satoshi = new FlyweightFactory();FlyweightFactory shigeru = new FlyweightFactory();// 出场Pokemon pikachu = satoshi.getPokemon("皮卡丘");Pokemon charizard = shigeru.getPokemon("喷火龙");// 战斗// 皮卡丘掉了半血pikachu.loseHP(50);// 喷火龙gg...System.out.println("喷火龙倒下了...\n");// 第二轮satoshi.getPokemon("皮卡丘");shigeru.getPokemon("电击魔兽");}
}
去吧!皮卡丘! (HP:100)
去吧!喷火龙! (HP:100)
喷火龙倒下了...去吧!皮卡丘! (HP:50)
去吧!电击魔兽! (HP:100)

4 应用

  • 字符串常量池:创建后的字符串会保存在常量池中以供复用
String a = "h";
String b = "h";
System.out.println(a == b);  // true
  • Integer缓存:Integer提供了[-127,128]范围的缓存
Integer a = 123;
Integer b = 123;
System.out.println(a == b);
  • 数据库连接池
  • 线程池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/86685.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白嫖idea

白嫖idea 地址 https://www.jetbrains.com/toolbox-app/

手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率

目录 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 前提条件 设置学习率 学习率的主流优化算法 手写数字识别之优化算法:观察Loss下降的情况判断合理的学习率 我们明确了分类任务的损失函数&#xff08;优化目标&#xff09;的相关概念和实现方法&#xff…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言&#xff08;Computer Language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称&#xff1a;Structured Query Language&…

4-1-netty

非阻塞io 服务端就一个线程&#xff0c;可以处理无数个连接 收到所有的连接都放到集合channelList里面 selector是有事件集合的 对server来说优先关注连接事件 遍历连接事件

【Acwing906】区间分组贪心策略证明与题解

题目描述 贪心策略 先按照左端点对所有区间进行排序&#xff0c;然后从左到右遍历每一个区间&#xff0c;如果遍历到的区间能够加入现在已经存在的某一个区间组中&#xff0c;则加入&#xff0c;否则&#xff0c;创建新的区间组&#xff0c;并将这个区间加入。 具体的方案是…

MongoDB 双机热备那篇文章是 “毒”

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis &#xff0c;Oracle ,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加微信号 liuaustin3 &#xff08;…

yo!这里是Linux基础开发工具介绍

目录 前言 基础开发工具 yum vim 1.基本介绍 2.基本操作 3.正常模式常用命令 4.底行模式常用命令 gcc/g gdb 1.基本介绍 2.常用操作 make/Makefile 1.背景 2.介绍 3.使用 git 1.介绍 2.操作 进度条程序简单实现 后记 前言 在学完初步的基础指令及权限控…

浏览器输入一个URL之后发生了什么?

URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为&#xff1a; 协议&#xff0c;eg http,https域名或者ip地址&#xff0c;eg www.baidu.com 域名相对于ip地址来说&#xff0c;更方便人们记忆&#xff0c;但是实际的网络传输中使用的是ip地址 端…

c++查漏补缺(1)

目录 1.explicit关键字 2.static关键字 3.友元函数 1.explicit关键字 exeplicit关键字是在构造函数要使用的关键字。可以防止“隐式构造”&#xff0c;例如&#xff1a; #include<iostream>using namespace std;class Date { public:explicit Date(int year, int mo…

当我焦虑时,我从CSDN的博主身上学到了什么?

文章目录 前言一、思考为什么会产生差距1.1 懒惰1.2 没有合理的规划学习时间 二、我该如何做&#xff1f;2.1 认真生活规律作息2.2 做事就是0和1 结语 前言 我们在学习的过程当中总会遇到一些比我们自己优秀的人&#xff0c;不论你是在更好的985或211院校学习&#xff0c;还是…

PHP8函数的引用和取消-PHP8知识详解

今天分享的是php8函数的引用和取消&#xff0c;不过在PHP官方的参考手册中&#xff0c;已经删除了此类教程。 1、函数的引用 在PHP8中不管是自定义函数还是内置函数&#xff0c;都可以直接简单的通过函数名调佣。函数的引用大致有下面3种&#xff1a; 1.1、如果是PHP的内置函…