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

前言

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

享元模式

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.mzph.cn/news/54578.shtml

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

相关文章

Jacoco XML 解析

1 XML解析器对比 1. DOM解析器&#xff1a; ○ 优点&#xff1a;易于使用&#xff0c;提供完整的文档树&#xff0c;可以方便地修改和遍历XML文档。 ○ 缺点&#xff1a;对大型文档消耗内存较多&#xff0c;加载整个文档可能会变慢。 ○ 适用场景&#xff1a;适合小型XML文档…

函数式编程-Stream流学习第二节-中间操作

1 Stream流概述 java8使用的是函数式编程模式,如同它的名字一样&#xff0c;它可以用来对集合或者数组进行链状流式操作&#xff0c;让我们更方便的对集合或者数组进行操作。 2 案例准备工作 我们首先创建2个类一个作家类&#xff0c;一个图书类 package com.stream.model;…

03.sqlite3学习——数据类型

目录 sqlite3学习——数据类型 SQL语句的功能 SQL语法 SQL命令 SQL数据类型 数字类型 整型 浮点型 定点型decimal 浮点型 VS decimal 日期类型 字符串类型 CHAR和VARCHAR BLOB和TEXT SQLite 数据类型 SQLite 存储类 SQLite 亲和类型(Affinity)及类型名称 Boo…

opencv案例03 -基于OpenCV实现二维码生成,发现,定位,识别

1.二维码的生成 废话不多说&#xff0c;直接上代码 # 生成二维码 import qrcode# 二维码包含的示例数据 data "B0018" # 生成的二维码图片名称 filename "qrcode.png" # 生成二维码 img qrcode.make(data) # 保存成图片输出 img.save(filename)img.sh…

vue关闭弹窗刷新父页面 this.$refs

代码截图 主页面 弹出框页面 接这一篇文章后续 参考链接

Python 数据分析——matplotlib 快速绘图

matplotlib采用面向对象的技术来实现&#xff0c;因此组成图表的各个元素都是对象&#xff0c;在编写较大的应用程序时通过面向对象的方式使用matplotlib将更加有效。但是使用这种面向对象的调用接口进行绘图比较烦琐&#xff0c;因此matplotlib还提供了快速绘图的pyplot模块。…

Python迭代器和生成器

一、迭代器 1.1、什么是迭代 迭代是指反复的执行一个过程&#xff0c;每次执行都会根据前一次的结果进行调整和优化。在计算机编程中&#xff0c;迭代常常用于循环执行某个操作&#xff0c;直到达到特定的条件或达成目标。迭代也可以用于指代软件开发中的“迭代开发”&#x…

R语言主成分分析

R语言主成分分析 之前介绍过怎么用SPSS进行主成分分析(PCA)&#xff0c;已经忘了的朋友们可以到主页看看 今天主要介绍下R语言主成分分析的几种方法。都是入门级别&#xff0c;跟着我一步步走&#xff0c;一点都不难哈~ 首先调用R语言自带的数据集&#xff0c;USArrests。这…

【Go 基础篇】Go语言中的数组:初识与应用

Go语言以其简洁、高效和强大的特性在编程界广受欢迎。数组作为一种基本的数据结构&#xff0c;在各种应用场景中扮演着重要角色。本文将引入Go语言中的数组&#xff0c;介绍其特点、创建、初始化以及基本应用&#xff0c;为你打开数组的大门。 前言 数组是一种固定大小的数据…

七层、四层和五层网络模型区别和联系

七层、四层和五层网络模型区别和联系 概述OSI网络7层模型&#xff08;概念型框架&#xff09;概述图片分析 四层模型概述常用协议OSI与TCP/IP四层的区别 五层模型概述三种网络模型对比 总结 概述 网络模型-七层模型&#xff08;OSI模型&#xff09;、五层协议体系结构和TCP/IP…

性能优化之分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…

“R语言+遥感“水环境综合评价方法

详情点击链接&#xff1a;"R语言遥感"水环境综合评价方法 一&#xff1a;R语言 1.1 R语言特点&#xff08;R语言&#xff09; 1.2 安装R&#xff08;R语言&#xff09; 1.3 安装RStudio&#xff08;R语言&#xff09; &#xff08;1&#xff09;下载地址 &…

如何基于亚马逊云科技打造高性能的 SQL 向量数据库 MyScale

MyScale 是一款完全托管于亚马逊云科技、支持 SQL 的高效向量数据库。MyScale 的优势在于&#xff0c;它在提供与专用向量数据库相匹敌甚至优于的性能的同时&#xff0c;还支持完整的 SQL 语法。在这篇文章中&#xff0c;我们将阐述 MyScale 是如何借助亚马逊云科技的基础设施&…

pnpm无法加载文件 (解决方法 )

现在要运行一个TS的项目&#xff0c;我的电脑上没有安装pnpm&#xff0c;导致我的vscode一直报错无法加载。 pnpm安装&#xff1a; npm install -g pnpm pnpm : 无法加载文件 pnpm : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运…

英语略读三

课文的客观&#xff0c;或者逻辑推理 同增通减 比错 对比选项&#xff0c;找一个明显的区别 防并列&#xff0c;文章再说主语在干嘛干嘛的&#xff0c;但是与答案的角度不一样&#xff0c;是并列的关系 在对比选项&#xff0c;不是证明正确的 具体问题具体分析&#xff0c;but…

【30天熟悉Go语言】10 Go异常处理机制

作者&#xff1a;秃秃爱健身&#xff0c;多平台博客专家&#xff0c;某大厂后端开发&#xff0c;个人IP起于源码分析文章 &#x1f60b;。 源码系列专栏&#xff1a;Spring MVC源码系列、Spring Boot源码系列、SpringCloud源码系列&#xff08;含&#xff1a;Ribbon、Feign&…

[Linux]文件IO

文章目录 1. 文件描述符1.1 虚拟地址空间1.1.1 存在的意义1.1.2 分区 1.2 文件描述符1.2.1 文件描述符1.2.2 文件描述符表 2. Linux系统文件IO2.1 open/close2.1.1 函数原型2.1.2 close函数原型2.1.3 打开已存在文件2.1.4 创建新文件2.1.5 文件状态判断 2.2 read/write2.2.1 re…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【四】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【四】&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章…

VMware虚拟机连不上网络

固定ip地址 进入网络配置文件 cd /etc/sysconfig/network-scripts 打开文件 vi ifcfg-ens33 编辑 BOOTPROTO设置为static&#xff0c;有3个值&#xff08;decp、none、static&#xff09; BOOTPROTO"static" 打开网络 ONBOOT"yes" 固定ip IPADDR1…

为什么需要websocket?

一、为什么需要websocket&#xff1f; 前端和后端的交互模式最常见的就是前端发数据请求&#xff0c;从后端拿到数据后展示到页面中。如果前端不做操作&#xff0c;后端不能主动向前端推送数据&#xff0c;这也是http协议的缺陷。 因此&#xff0c;一种新的通信协议应运而生---…