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

文章目录

  • 享元模式简介
  • 结构
  • 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);
    }

    @Override
    public 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);
    }

    @Override
    public 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());
    }
}
  • 测试结果
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置详细解释:(2)events事件配置

在nginx核心配置文件conf/nginx.conf中&#xff0c;有全局配置&#xff0c;events模块&#xff0c;http模块&#xff0c;(http模块中有嵌套多个模块)。常见配置项&#xff0c; events模块中&#xff0c;如下图&#xff1a; events是nginx与用户之间处理事件的功能。 如单个wo…

selenium自动化介绍

文章目录 一、selenium原理 安装二、selenium使用1.创建浏览器对象&#xff0c;访问网址2.消除警告提示3.不显示浏览器中受控制字样4.防检测5.设置延时5.1强制延时5.2隐式延时 6.设置浏览器窗口大小 三、案例实战&#xff1a;百度搜索四、iframe标签五、案例实战&#xff1a;Q…

SpringBoot+百度地图+Mysql实现中国地图可视化

通过SpringBoot百度地图Mysql实现中国地图可视化 一、申请百度地图的ak值 进入百度开发者平台 编辑以下内容 然后申请成功 二、Springboot写一个接口 确保数据库里有数据 文件目录如下 1、配置application.properties文件 #访问端口号 server.port9090 # 数据库连接信息 spr…

【Vue】响应式特性

响应式&#xff1a;简单理解就是数据改变&#xff0c;视图会自动更新。 如何访问 和 修改 data中的数据&#xff08;响应式演示&#xff09; data中的数据, 最终会被添加到实例上 例如这里&#xff0c;app身上就会拥有msg属性&#xff0c;修改msg的值&#xff0c;界面的值也会…

原生APP开发和Flutter开发的比较

原生APP开发和Flutter开发各有优缺点&#xff0c;适用于不同的场景和需求。下面是两者的详细比较&#xff0c;从开发语言、性能、开发效率、维护和更新、社区和支持等多个方面进行分析。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。…

成功解决“IndexError: queue index out of range”错误的全面指南

成功解决“IndexError: queue index out of range”错误的全面指南 引言 在Python编程中&#xff0c;queue模块提供了同步队列类&#xff0c;包括FIFO&#xff08;先进先出&#xff09;队列Queue&#xff0c;LIFO&#xff08;后进先出&#xff09;队列LifoQueue&#xff0c;以…

uniapp登录成功后跳回原有页面+无感刷新token

uniapp登录成功后跳回原有页面 引言 在C端的页面场景中&#xff0c;我们经常会有几种情况到登录页&#xff1a; 区分需要登录和不用登录的页面&#xff0c;点击需要登录才能查看的页面 已经登录但是超时&#xff0c;用户凭证失效等原因 以上情况可以细分为两种&#xff0c;一…

2023年全国青少信息素养大赛智能算法C++挑战赛复赛初中组真题,包含答案解析分享

【读前注意】:此卷是真题,答案解析辛苦整理,大家多多点赞并转发支持,需要下载空白文档题目版本(包含2023年小学组和初中组的题目pdf文件),可以在留言区的第一条留言的链接中进行复制,然后再浏览器中下载即可。 智能算法挑战复赛初中组 (总共

AngularJS基础语法(2009版本)

jquery和AngularJS 数据绑定和获取对比&#xff1a; jquery&#xff0c;要操作DOM&#xff1a; angularJS&#xff0c;无需操作DOM就可以进行动态数据变化&#xff1a; 要使用Angularjs就需要在html页面先引入&#xff1a; ng-app&#xff1a; html页面中&#xff0c;需要给…

操作系统的体系结构:宏内核和微内核

操作系统的体系结构是一个开放的问题。操作系统在核心态为应用程序提供公共的服务&#xff0c;那么操作系统在核心态应该提供什么服务、怎样提供服务&#xff1f;有关这个问题的回答形成了两种主要的体系结构&#xff1a;宏内核和微内核。 宏内核&#xff1a;大而全 宏内核系统…

【面试题-004】ArrayList 和 LinkList区别

ArrayList 和 LinkedList 都是 Java 中常用的动态数组实现&#xff0c;都实现了 List 接口&#xff0c;但它们在内部数据结构和性能方面有所不同&#xff1a; 内部数据结构&#xff1a; ArrayList 是基于动态数组的数据结构&#xff0c;它允许快速随机访问。数组的大小在创建时…

simCSE句子向量表示(1)-使用transformers API

SimCSE SimCSE: Simple Contrastive Learning of Sentence Embeddings. Gao, T., Yao, X., & Chen, D. (2021). SimCSE: Simple Contrastive Learning of Sentence Embeddings. arXiv preprint arXiv:2104.08821. 1、huggingface官网下载模型 官网手动下载&#xff1a;pri…

【Self-Attention——Transform—Bert】相关的基础理论

1.Self-Attention模型图解 传统的循环神经网络&#xff0c;如上左图1&#xff0c;并不能解决并行化的问题&#xff0c;右图就是一个self-Attention可以实现并行化&#xff0c;并且能解决对于所有信息的读取利用。 将self—Attention替换相应的GRU或者RNN&#xff0c;就能实现从…

C#WPF数字大屏项目实战09--机器产量统计

1、区域布局 2、柱状图 Live chart 是一个跨平台的图表库 .Net&#xff0c;这是一个简单、灵活、交互式、强大的跨平台图表库&#xff0c;支持Maui、Uno Platform、Blazor-wasm、WPF、WinForms、Xamarin、Avalonia、WinUI、UWP。提供超过60多种图表类型&#xff0c;包括&#…

NumPy应用(一)

NumPy学习篇1 NumPy是一个强大的Python库&#xff0c;它提供了高效的多维数组对象和各种用于数组操作的函数。以下是NumPy学习大纲&#xff0c;详细介绍了NumPy的核心功能和概念。 1. NumPy 简介 NumPy是一个用于处理多维数组的Python库&#xff0c;它提供了一个强大的数组对…

【启程Golang之旅】从结构到接口揭秘Go的“面向对象”面纱

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

基于ssm校园自行车租赁系统-计算机毕业设计源码82064

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;学校当然也不例外。基于ssm的校园自行车租赁系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#…

《已解决》F12显示已在程序中暂停

首先打开F12-->源代码 最后一步&#xff1a;

C#WPF数字大屏项目实战08--生产量/良品统计

1、区域划分 生产量/良品统计这部分位于第二列的第二行 2、livechart拆线图 定义折线图,如下: <lvc:CartesianChart> <lvc:CartesianChart.Series> <!--设置Series的类型为 Line 类型, 该类型提供了一些折线图的实现--> <lvc:LineSeries/>…

【安装】VMware虚拟机安装windows操作系统,VM的相关操作

目录 引出报错&#xff1a;press any key to boot form cd激活调整显示 在VMware上新建虚拟机&#xff0c;并安装Windows1、新建虚拟机2、装载 ISO 镜像3、安装Windows server 20164、开机初始化 虚拟机操作1、虚拟机基本操作2、虚拟机快照3、虚拟机克隆4、VMware Tools 总结 引…