设计模式—结构型模式之享元模式

设计模式—结构型模式之享元模式

享元模式(Flyweight Pattern),运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。对象结构型。
在享元模式中可以共享的相同内容称为内部状态(IntrinsicState),而那些需要外部环境来设置的不能共享的内容称为外部状态(Extrinsic State),由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。
在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。

享元模式可以理解为池化技术。

享元模式包含如下角色:

  • Flyweight: 抽象享元类 Connection
  • ConcreteFlyweight: 具体享元类 ConnectionImpl(user,pwd,url)
  • UnsharedConcreteFlyweight: 非共享具体享元类ConnectionImpl(state)
  • FlyweightFactory: 享元工厂类;可以写一个简单工厂,因为产品就一个Connection。

例子

比如一个网吧中有很多电脑,每个电脑都可以被人使用,但是当有人在使用这个电脑,就不能被其他人使用了。这便是享元模式的实例。

/*** 抽象电脑类*/
public abstract class AbstarctComputer {//是否能被使用boolean canUse = true;//使用电脑abstract void useComputer();//使用完成abstract void useComputerCompletion();public boolean isCanUse(){return canUse;}
}

实际的电脑类如下:

public class MyComputer extends AbstarctComputer{//电脑编号private String id;public MyComputer(String id) {this.id = id;}/*** 使用电脑*/@Overridevoid useComputer() {System.out.println(this.id + "号电脑使用中");//设置其他人不能使用this.canUse = false;}@Overridevoid useComputerCompletion() {System.out.println(this.id + "号电脑使用完成");//设置其他人可以使用this.canUse = true;}public String getId() {return id;}
}

网吧类如下:

public class MyInternetCafe {//电脑集合--》池子private static Map<String,MyComputer> computerPool = new HashMap<>();static {MyComputer myComputer1 = new MyComputer("111");MyComputer myComputer2 = new MyComputer("222");computerPool.put(myComputer1.getId(),myComputer1);computerPool.put(myComputer2.getId(),myComputer2);}/*** 通过id返回能够使用的电脑,如果找不到,返回一个可以使用的* @param id* @return*/public static AbstarctComputer getComputer(String id){MyComputer computer = computerPool.get(id);if(computer == null || !computer.isCanUse()) {//如果没有这个id 或者 不能被使用,找一个可以使用的for (MyComputer myComputer : computerPool.values()) {if(myComputer.isCanUse()){System.out.println("您要使用的"+id+"号电脑正在被使用或者无此电脑,为您找到一台电脑id为:"+myComputer.getId());return myComputer;}}//都在使用返回空return null;}return computer;}
}

测试类如下:

public class Test {public static void main(String[] args) {AbstarctComputer computer = MyInternetCafe.getComputer("111");computer.useComputer();AbstarctComputer computer1 = MyInternetCafe.getComputer("111");computer1.useComputer();computer.useComputerCompletion();AbstarctComputer computer2 = MyInternetCafe.getComputer("111");computer2.useComputer();}
}

运行截图如下:

运行截图

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

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

相关文章

机器学习实战 ——《跟着迪哥学Python数据分析与机器学习实战》(2)

机器学习实战 ——《跟着迪哥学Python数据分析与机器学习实战》&#xff08;2&#xff09; 七、贝叶斯算法7.1 新闻分类任务实战7.1.1 结巴分词7.1.2 词云表示工具包wordcloud7.1.3 TF-IDF特征 八、聚类算法K-means K-均值聚类算法评估指标优缺点 DBSCAN&#xff08;Density-Ba…

ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

VS搭建QT环境失败1

在VS中做一个简单QT控制台程序; 包含目录已经添加如下图;可以找到QCoreApplication头文件;可以找到QCoreApplication类,把鼠标放上去会有提示;但是由QCoreApplication类生成对象会出错;app这个变量提示出错; 同时显示200多个错误;这是VS2015; 看一下我的QT安装有没有缺…

C++(11):原子类型的is_lock_free/is_always_lock_free

原子类型提供了一个成员函数is_lock_free&#xff0c;用于指示该原子类型是不是以无锁方式实现的&#xff1a; #include <iostream> #include <atomic> using namespace std;int main(){cout<<atomic_char().is_lock_free()<<endl;cout<<atomic…

【PostgreSQL】解决PostgreSQL时区(TimeZone)问题

问题描述 最近在使用PostgreSQL中&#xff0c;对行记录进行设置创建时间&#xff08;created_time&#xff09;时&#xff0c;出现了设置了now()时间而数据库中写入的数据是不一致的数据。 eg&#xff1a; insert into dept ( created_at, updated_at) VALUES (now(),now())…

线性表--队列-1

文章目录 主要内容一.队列基础练习题1.用链式存储方式的队列进行删除操作时需要 ( D ).代码如下&#xff08;示例&#xff09;: 2.若以1,2,3,4作为双端队列的输入序列&#xff0c;则既不能由输入受限的双端队列得到&#xff0c;又不能由输出受限的双端队列得到的输出序列是( C …

算法分析与设计课后练习22

设W(5,7,10,12,15,18,20)和M35&#xff0c;使用过程SUMOFSUB找出W种使得和数等于M的全部子集并画出所生成的部分状态空间树

宝塔天翼云部署记录

1.不要用宝塔的LNMP自动化工具&#xff1b;去商店里面安装&#xff1b; 2.选择Centos 版本8.0以下的&#xff0c;因为8以上不维护了。 3.记得开放端口&#xff0c;安全组下面。 4.安装FTP多次失败&#xff0c;虽然有些SB但是可以修复注意。 永别。 天翼云服务器80、443等特…

国产压力测试工具的主要作用

国产压力测试工具可以帮助软件开发和维护团队对系统进行全面的性能测试&#xff0c;以评估系统在高负载下的性能表现。以下是国产压力测试工具的主要作用&#xff1a; 性能评估&#xff1a;国产压力测试工具可以模拟多用户同时对系统进行访问和操作&#xff0c;通过对系统的响应…

Vite - 静态资源处理 - json文件导入

直接就说明白了 vite 中对json 文件直接当作一个模块来解析。 可以直接导入使用&#xff01; 可以直接导入使用&#xff01; 可以直接导入使用&#xff01;json文件中的key&#xff0c;直接被作为一个属性&#xff0c;可以单独被导入。 因此&#xff0c;导入json文件有两种方式…

金山云2023年Q3财报:持续向好!

11月21日&#xff0c;金山云公布了2023年第三季度业绩。 财报显示&#xff0c;金山云Q3营收16.3亿元&#xff0c;调整后毛利率达12.1%再创历史新高&#xff0c;调整后毛利额同比上涨57.5%。今年第三季度&#xff0c;公有云实现收入10.2亿元&#xff0c;毛利率达到4.7%&#xf…

反序列化漏洞介绍

反序列化漏洞 序列化和反序列化本身不存在漏洞&#xff0c;之所以会有反序列化漏洞&#xff0c;是因为开发者在编写时&#xff0c;加入了一些恶意的代码 PHP反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者利用未经验证的用户输入来执行恶意代码。这种漏洞通常出现在PHP…

OpenAI GPT-4 Turbo发布:开创AI新时代

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. GPT-4 Turbo的突破1.1上下文长度和控制手段的加强&#xff1a;1.2多模态支持&#xff1a…

UE必学系列(基础篇完结)

导语&#xff1a; UE必须系列基础篇完结&#xff0c;敬请期待进阶篇 基础篇文章&#xff1a;在掌握了UE4基础操作&#xff0c;并且能上手做一些项目之后&#xff0c;对UE4知识进行更完善的知识体系学习。主要是把学习视频链接汇总&#xff0c;主要学习思路是 优先官方视频和官…

Linux 网络:PMTUD 简介

文章目录 1. 前言2. Path MTU Discovery(PMTUD) 协议2.1 PMTUD 发现最小 MTU 的过程 3. Linux 的 PMTUD 简析3.1 创建 socket 时初始化 PMTUD 模式3.2 数据发送时 PMTUD 相关处理3.2.1 源头主机发送过程中 PMTUD 处理3.2.2 转发过程中 PMTUD 处理 4. PMTUD 观察5. 参考链接 1. …

vue路由传参的详解1.命名路由的传参和取出2.query传参和取出3.meta传参和取出4.其他方式5.注意点 代码和注释

Vue是一款流行的前端框架&#xff0c;其路由功能可以帮助我们实现单页应用&#xff08;SPA&#xff09;的跳转和页面切换。在实际开发中&#xff0c;我们会遇到需要在路由之间传递参数的情况&#xff0c;本篇博客将详细介绍Vue路由传参和取出参数的几种方式。 目录 1. 命名路由…

使用Python实现几种底层技术的数据结构

使用Python实现几种底层技术的数据结构 数据结构(data structure)是带有结构特性的数据元素的集合&#xff0c;它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系&#xff0c;并对这种结构定义相适应的运算&#xff0c;设计出相应的算法&#xff0c;并确保经过这…

千字文||无聊又数了一下千字文字数

千字文的字数去除标点符号真的整整一千个不多的不少 该文章无技术含量&#xff0c;仅三字经原文&#xff0c;学技术的同学可以止步了 千字文&#xff08;原文&#xff09; 【作者】周兴嗣 【朝代】南北朝 天地玄黄&#xff0c;宇宙洪荒。 日月盈昃&#xff0c;辰宿列张。 寒来…

抗混叠在微小目标检测中的重要性

文章目录 摘要1、简介2、相关研究2.1、微小物体检测2.2. 抗锯齿过滤器3、方法3.1. Wavelet Pooling3.2 一致顺序的Wavelet Pooling的WaveCNet3.3、Bottom-Heavy Backbone4、实验4.1、预训练数据集4.2、微小目标检测数据集4.3、抗混叠方法的选择及应用顺序4.4、小波的选择4.5、T…

Python 进程和线程详解(multiprocessing、threading)

文章目录 1 概述1.1 进程 VS 线程1.2 优缺点 2 进程2.1 三个步骤2.2 多进程2.3 带参数2.3.1 元组参数 args2.3.2 字典参数 kwargs 2.4 获取进程编号2.5 设置进程守护 3 线程3.1 三个步骤3.2 多线程3.3 带参数2.3.1 元组参数 args2.3.2 字典参数 kwargs 2.4 获取线程编号2.5 设置…