设计模式(十)结构型模式---享元模式(flyweight)

文章目录

  • 享元模式简介
  • 结构
  • UML图
  • 具体实现
    • UML图
    • 代码实现

享元模式简介

  • 享元模式(fly weight pattern)主要是通过共享对象来减少系统中对象的数量,其本质就是缓存共享对象,降低内存消耗。
  • 享元模式将需要重复使用的对象分为两个状态:内部状态和外部状态,内部状态是不会变化的,可以被多个对象共享,而外部状态会随着对象的使用而改变。
  • 实际中的使用:jdk-Interger(-128 127),存在于缓存池。

结构

  • 1.抽象享元角色(FlyWeight):享元对象抽象基类或者接口,同事定义出对象的外部状态和内部状态的接口或实现;
  • 2.具体享元角色(Concrete FlyWeight):实现抽象享元类中的方法,是需要共享的对象类。
  • 3.享元工厂(FlyWeight Factory):维护一个享元对象的池,内部使用容器存储已经创建的享元对象。

UML图

在这里插入图片描述

具体实现

例子:从享元工厂类根据单车类型,获取对应的单车子类

UML图

在这里插入图片描述

代码实现

  • 抽象享元类
package com.xxliao.pattern.structure.flyweight.demo;/*** @author xxliao* @description: 抽象享元类 FlyWeight , 单车类* @date 2024/5/25 17:17*/
public abstract class Bike {protected String color;protected float price;public Bike(String color, float price) {this.color = color;this.price = price;}/*** @description  打印单车信息* @author  xxliao* @date  2024/5/25 17:19*/public abstract void print();
}
  • 具体享元角色
package com.xxliao.pattern.structure.flyweight.demo;/*** @author xxliao* @description: 具体享元类 Concrete FlyWeight,* @date 2024/5/25 17:20*/
public class MoBike extends Bike{public MoBike(String color, float price) {super(color, price);}@Overridepublic void print() {System.out.println("生产成功:MoBike---"+color+",价格" + price + "元");}
}
package com.xxliao.pattern.structure.flyweight.demo;/*** @author xxliao* @description: 具体享元类 Concrete FlyWeight,* @date 2024/5/25 17:20*/
public class OfoBike extends Bike{public OfoBike(String color, float price) {super(color, price);}@Overridepublic void print() {System.out.println("生产成功:OfoBike---"+color+",价格" + price + "元");}
}
  • 享元工厂
package com.xxliao.pattern.structure.flyweight.demo;import java.util.HashMap;
import java.util.Map;/*** @author xxliao* @description: 享元工厂* @date 2024/5/25 17:23*/
public class BikeFlyWeightFactory {// 缓存容器public static Map<String,Bike> bikeMap = new HashMap<>();// 获取享元对象public static Bike getBike(String color,String type) {String key = color + "-" + type;if(bikeMap.containsKey(key)) {// 已经在缓存容器中,直接返回return bikeMap.get(key);}else {// 缓存中没有,新建放入缓存中,然后返回Bike bike = null;if("mobike".equals(type)) {bike = new MoBike(color,199);}else if("ofobike".equals(type)) {bike = new OfoBike(color,199);}bikeMap.put(key,bike);return bike;}}
}
  • 测试客户端
package com.xxliao.pattern.structure.flyweight.demo;/*** @author xxliao* @description: 享元模式 测试客户端* @date 2024/5/25 17:30*/
public class Client {public static void main(String[] args) {Bike bike1 = BikeFlyWeightFactory.getBike("橘色", "mobike");Bike bike2 = BikeFlyWeightFactory.getBike("黄色", "ofobike");bike1.print();bike2.print();System.out.println("======================================================");Bike bike3 = BikeFlyWeightFactory.getBike("黄色", "ofobike");System.out.println(BikeFlyWeightFactory.bikeMap.size());}
}
  • 测试结果
    在这里插入图片描述

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

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

相关文章

7-14 字节序(Endianness)---PTA实验C++

一、题目描述 “内存寻址的最小单位是字节”——明白。 “每个字节有唯一的编号&#xff0c;称为地址”——明白。 “C中int通常为四个字节”——了解。 “int x 1;最低字节是1还是0&#xff1f;——纳尼&#xff1f; 事实上&#xff0c;这里有点小小分歧&#xff1a; 多字…

JavaScript移除事件的方法

JavaScript移除事件的方法有两种&#xff0c;分别是removeEventListener和οnclicknull。 使用removeEventListener方法&#xff1a; removeEventListener方法用于从元素中移除之前添加的事件监听器。它需要传入三个参数&#xff1a;事件类型、事件处理函数和一个可选的布尔值…

IDEA 学习之 命令行太长问题

现象 Error running App Command line is too long. In order to reduce its length classpath file can be used. Would you like to enable classpath file mode for all run configurations of your project?解决办法 办法一 .idea\workspace.xml ——> <compone…

软件开发整体介绍

黑马程序员瑞吉外卖 文章目录 一、软件开发流程二、角色分工三、软件环境 一、软件开发流程 二、角色分工 三、软件环境

【探索微软 Edge:现代化的网页浏览体验】

探索微软 Edge&#xff1a;现代化的网页浏览体验 微软 Edge 是一款现代化的网页浏览器&#xff0c;它由微软开发并推出&#xff0c;旨在提供更快速、更安全、更现代化的网页浏览体验。Edge 浏览器基于 Chromium 开源项目&#xff0c;这使得它拥有与 Google Chrome 类似的性能和…

13.FreeRTOS使用事件标记组

FreeRTOS 事件标记组 什么是事件标记组&#xff1f; 事件标记组是一个24&#xff08;在 FreeRTOS 中&#xff0c;默认情况下&#xff0c;事件标记组的位数是 24 位&#xff09;位的变量&#xff0c;每一位&#xff08;bit&#xff09;可以独立地被设置或清除。任务可以等待一…

锁是实现原子性的一种方案,但是原子性的实现不一定需要通过锁机制保证

前言&#xff1a;在实际开发过程中&#xff0c;我们可能会通过事务来保证原子性&#xff0c;但是很多人存在误解&#xff0c;他们会以为Transactional 注解原子性就是代表java中的CAS或者锁那种也能保证并发情况下的原子性。其实不是这样的&#xff0c;MySQL的原子性是通过redo…

GraphQL(2):使用express和GraphQL编写helloworld

1 安装express、graphql以及express-graphql 在项目的目录下运行一下命令。 npm init -y npm install express graphql express-graphql -S 2 新建helloworld.js 代码如下&#xff1a; const express require(express); const {buildSchema} require(graphql); const grap…

vue3与ts的组合式API

vue3与ts的组合式API props 1.基本props <script setup lang"ts"> const props defineProps<{foo: stringbar?: number }>() </script>2.抽离props <script setup lang"ts"> interface Props {foo: stringbar?: number }co…

leetcode146.LRU缓存,从算法题引入,全面学习LRU和链表哈希表知识

leetcode146. LRU 缓存 题目链接 请你设计并实现一个满足 LRU (最近最少使用) 缓存约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关…

【QT】父子按钮同时响应点击事件

QPushButton如何响应点击事件 QPushButton::event(QEvent *e) 。可以看到在QPushButton中的event函数中并没有鼠标点击相关的操作&#xff0c;那么我们去QAbstractButton::event中寻找 damn it!。依然没有那我们去QWidget::event中寻找 damn it! 只有mousePressEvent mouseR…

leetcode165.比较版本号,简单模拟

leetcode165.比较版本号 给你两个 版本号字符串 version1 和 version2 &#xff0c;请你比较它们。版本号由被点 ‘.’ 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。 比较版本号时&#xff0c;请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字…

主流摄像机:海康、大华、宇视、华为等RTSP格式

主流摄像机&#xff1a;海康、大华、宇视、华为等RTSP格式 解决方案速览海康摄像机大华摄像机宇视摄像机华为摄像机 解决方案速览 品牌rtsp格式rtsp举例海康rtsp://[username]:[password][ip]:[port]/[codec]/[channel]/[subtype]/av_streamrtsp://admin:admin123192.168.1.10…

libcef.dll丢失的解决方法-多种libcef.dll亲测有效解决方法分享

libcef.dll是Chromium Embedded Framework (CEF)的核心动态链接库&#xff0c;它为开发者提供了一个将Chromium浏览器嵌入到本地桌面应用程序中的解决方案。这个库使得开发者能够利用Chromium的强大功能&#xff0c;如HTML5、CSS3、JavaScript等&#xff0c;来创建跨平台的应用…

罕见!史诗级“大堵船”

新加坡港口的停泊延误时间已延长至7天&#xff0c;积压的集装箱数量达到惊人的450000标准箱&#xff0c;远超新冠疫情暴发时期的数轮高点。业内认为&#xff0c;近期东南亚恶劣的天气情况加剧了该区域港口拥堵。 5月31日&#xff0c;上海航运交易所&#xff08;下称“航交所”…

重生奇迹MU召唤师如何学习狂暴术?

一、了解狂暴术的基本信息 狂暴术是一种非常强大的技能&#xff0c;可以让召唤师的攻击力和防御力大幅度提高&#xff0c;但同时也会增加自身的伤害。在使用狂暴术之前&#xff0c;召唤师需要仔细考虑自己的状态和对手的情况。 二、学习狂暴术的方法 1.通过任务学习 在游戏…

Docker安装与使用 --学习笔记

一、概述 Docker是什么? Docker是一种工具&#xff0c;类似于一个虚拟箱子&#xff0c;可以把软件和它运行所需要的环境打包放进这个箱子里。这样&#xff0c;无论这个箱子放到哪里&#xff0c;软件都能像在原来的地方一样运行&#xff0c;不会因为换了地方就出问题。 假设…

uniapp使用数据持久化存储

什么是持久化存储 持久化存储是指将数据存储在非易失性介质中&#xff0c;以保证数据在系统重启或断电后仍能保持不变。这种存储方式确保数据持久存储并且可靠地被读取和访问&#xff0c; 简答来说&#xff1a;就是防止丢失&#xff0c;长期存储 为什么要用持久化存储 Pini…

leetcode5 最长回文子串

给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s "cbbd" 输…

【Java】一文看懂Thread 线程池的 7 种创建方式、任务队列及自定义线程池(代码示例)

本文摘要&#xff1a;【Java】Thread 线程池的 7 种创建方式及自定义线程池&#xff08;代码示例版&#xff09; &#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专…