享元模式的学习与使用

news2024/10/7 6:50:37

1、享元模式的学习

  当我们需要创建大量相似的对象时,享元模式(Flyweight Pattern)可以提供一种有效的解决方案。享元模式旨在通过共享对象来最小化内存使用和提高性能。它将对象分为可共享的内部状态(Intrinsic State)和不可共享的外部状态(Extrinsic State),并通过共享内部状态来减少对象的数量。
  在享元模式中,共享对象由享元工厂(Flyweight Factory)来管理。当客户端需要一个对象时,它可以向享元工厂请求一个实例。如果工厂已经创建了一个相同的对象实例,则返回该实例;否则,工厂将创建一个新的对象实例并将其加入到内部存储中。
  以下是享元模式的几个关键角色:

  1. 享元接口(Flyweight):定义共享对象的接口,包括操作内部状态的方法。
  2. 具体享元类(Concrete Flyweight):实现享元接口,存储内部状态,并对内部状态进行操作。
  3. 享元工厂类(Flyweight Factory):负责管理和提供享元对象。它维护一个享元池(Flyweight Pool)来存储已创建的享元对象。
    在这里插入图片描述

2、享元模式的使用

  假设你正在开发一个游戏,其中有多个怪物对象,每个怪物对象都有自己的类型和位置信息。怪物的类型包括"小怪物"、“中怪物"和"大怪物”。
享元接口

public abstract class AbstractMonster {

    /**
     * 获取类型
     *
     * @return
     */
    protected abstract String getType();

    /**
     * 获取位置
     *
     * @param position
     * @return
     */
    protected abstract String getPosition(String position);

    protected String getMonster(String position) {
        return getType() + getPosition(position);
    }

}

具体享元类(小怪物)

public class SmallMonster extends AbstractMonster {
    @Override
    protected String getType() {
        System.out.println("type是small的怪物");
        return "type是small的怪物";
    }

    @Override
    protected String getPosition(String position) {
        System.out.println("position信息是:" + position);
        return "position信息是:" + position;
    }
}

具体享元类(中怪物)

public class MiddleMonster extends AbstractMonster {
    @Override
    protected String getType() {
        System.out.println("type是middle的怪物");
        return "type是middle的怪物";
    }

    @Override
    protected String getPosition(String position) {
        System.out.println("position信息是:" + position);
        return "position信息是:" + position;
    }
}

具体享元类(大怪物)

public class BigMonster extends AbstractMonster {
    @Override
    protected String getType() {
        System.out.println("type是big的大怪物");
        return "type是big的大怪物";
    }

    @Override
    protected String getPosition(String position) {
        System.out.println("position信息:" + position);
        return "position信息:" + position;
    }
}

享元工厂

public class MonsterFactory {

    private Map<MonsterTypeEnum, AbstractMonster> monsterMap = new HashMap<>();
    private static MonsterFactory monsterFactory = null;

    private MonsterFactory() {
    }

    public synchronized static MonsterFactory getInstance() {
        if (Objects.isNull(monsterFactory)) {
            monsterFactory = new MonsterFactory();
        }
        return monsterFactory;
    }

    public String getMonster(MonsterTypeEnum type, String position) {
        AbstractMonster abstractMonster = monsterMap.get(type);
        if (Objects.isNull(abstractMonster)) {
            switch (type) {
                case SMALL:
                    monsterMap.put(MonsterTypeEnum.SMALL, new SmallMonster());
                case MIDDLE:
                    monsterMap.put(MonsterTypeEnum.MIDDLE, new MiddleMonster());
                case BIG:
                    monsterMap.put(MonsterTypeEnum.BIG, new BigMonster());
            }
            abstractMonster = monsterMap.get(type);
        }
        return abstractMonster.getMonster(position);
    }
}

怪物类型状态枚举

public enum MonsterTypeEnum {

    SMALL("small"), MIDDLE("middle"), BIG("big");

    private String name;

    MonsterTypeEnum(String name) {
        this.name = name;
    }


}

客户端

public class MonsterClient {

    public static void main(String[] args) {
        MonsterFactory.getInstance().getMonster(MonsterTypeEnum.MIDDLE,"东北");
        MonsterFactory.getInstance().getMonster(MonsterTypeEnum.BIG,"西北");
        MonsterFactory.getInstance().getMonster(MonsterTypeEnum.SMALL,"西南");
    }
}
type是middle的怪物
position信息是:东北
type是big的大怪物
position信息:西北
type是small的怪物
position信息是:西南

3、总结

  享元模式的核心思想是将对象的状态分为内部状态和外部状态,并共享内部状态以减少对象的数量。这样可以节省内存空间,并提高系统的性能。

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

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

相关文章

websocket前端的连接与接收数据

什么是websocket 1, WebSocket是一种用于在客户端和服务器之间进行全双工通信的网络协议。它使得在单个TCP连接上可以进行双向通信&#xff0c;允许服务器主动地发送数据给客户端&#xff0c;同时客户端也可以向服务器发送数据。与传统的HTTP请求-响应模型不同&#xff0c;Web…

百度排名代发收录怎么上百度

百度排名代发收录怎么上百度&#xff0c;如何提高百度排名&#xff0c;网站提高排名最新手册&#xff01;#seo 今天来点不一样的&#xff0c;就是讲一下百度竞价里边最基础也是最容易踩的一个坑&#xff0c;就是我发现很多人很喜欢把自己推广的产品或者说业务直接作为关键词上…

OpenAI 发布的新语音系统Whisper能力到底有多强?

OpenAI 最近发布了一个名为Whisper 的自动语音识别系统&#xff0c;声称其在英语语音识别方面已经接近人类水平的鲁棒性和准确性。这个系统使用了68万小时多任务监督数据来进行训练&#xff0c;并且在处理口音、背景噪音和技术语言等复杂场景时表现出了很好的鲁棒性。那么&…

s3 删除事故?

起因 一次巡检s3备份查看时, 一回车手滑,出现了下面这种画面,生产事故?!!! 现象 aws s3 rm s3://gfai-hk/upload.cmd 证实的确被删除了,推断后面的生产数据也被全删, 尝试用s3命令恢复发现需要该对象开启版本控制, rm被删除才有可能找回,否则永久删除于是尝试下面的命令 先…

跟着李沐学AI(动手学深度学习 PyTorch版)学习笔记——02深度学习介绍

1.课程安排大概共34天的课-&#xff08;计划7月底看完&#xff0c;争取做到最少两天一更&#xff09; 2.动手学深度学习课本教材 3.课程谈论坛 4.pytorch论坛 一、 目标 二、内容 三、 学习目标&#xff1a; 四、简单了解深度学习 深度学习&#xff1a; 图片分类物体的检测和…

华为OD机试真题 Python 实现【区间连接器】【2023Q1 200分】,附详细解题思路

一、题目描述 有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点)&#xff0c;区间有可能重叠、相邻&#xff0c;重叠或相邻则可以合并为更大的区间&#xff1b; 给定一组连接器[x1, x2, x3, …]&#xff08;x 表示连接器的最大可连接长度&#xff0c;即 x>gap&…

python网络编程笔记(一)

一&#xff1a;Socket简介 套接字起源于20世纪70年代加利福尼亚大学伯克利分校版本的Unix,即人们所说的BSD Unix。因此,有时人们也把套接字称为“伯克利套接字"或"BSD套接字”。一开始,套接字被设计用在同 -台主机上多个应用程序之间的通讯BSD Socket接口是TCP/IP网…

ArcMap发布arcgis sever缓存瓦片服务

1.全能电子地图下载瓦片地图 2.地图拼接 acrgis sever缓存瓦片 下载完成的文件目录 3.arcMap添加数据 连接本地文件 这一步有坑&#xff0c;一定要加载到瓦片最外层目录&#xff0c;否则看不到图层文件。 找到图层数据&#xff0c;点击添加 添加数据完成&#xff0c;开始发布服…

数字化和物联网的发展如何改变我们的生活方式?

数字化和物联网 (IoT) 的发展已经给我们的生活方式带来了重大变化&#xff0c;而且这些变革将在未来继续发生。以下是数字化和物联网影响我们生活的一些方式&#xff1a; 连接设备和智能家居&#xff1a;物联网使日常物品能够连接到互联网并相互通信。这种连通性允许创建智能家…

记录一次oracle报错IMP-00058: 遇到 ORACLE 错误 904 ORA-00904: “xxx“: 标识符无效

错误原因&#xff1a;导入的表中缺少DATASRC字段 解决方法&#xff1a;在要导入的表中加上DATASRC字段

对 React 状态管理的理解及方案对比

1、React 状态、通信 React 为什么需要状态管理 React 特点&#xff1a; 专注 view 层&#xff1a;专注 view 层 的特点决定了它不是一个全能框架&#xff0c;相比 angular 这种全能框架&#xff0c;React 功能较简单&#xff0c;单一。UIrender(data)UIrender(data)&#x…

Keras-深度学习-神经网络-人脸识别模型

目录 模型搭建 模型训练 模型搭建 ①导入所需的库&#xff0c;导入了 Keras 和其他必要的库&#xff0c;用于构建和处理图像数据。 from keras.models import Sequential from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D import os from PIL import Image …

《C++高级编程》读书笔记(十二:利用模板编写泛型代码)

1、参考引用 C高级编程&#xff08;第4版&#xff0c;C17标准&#xff09;马克葛瑞格尔 2、建议先看《21天学通C》 这本书入门&#xff0c;笔记链接如下 21天学通C读书笔记&#xff08;文章链接汇总&#xff09; 1. 模板概述 模板将参数化的概念推进了一步&#xff0c;不仅允许…

用Python搭建监控平台详解

概要 监控和运维&#xff0c;是互联网工业链上非常重要的一环。监控的目的就是防患于未然。通过监控&#xff0c;我们能够及时了解到企业网络的运行状态。一旦出现安全隐患&#xff0c;你就可以及时预警&#xff0c;或者是以其他方式通知运维人员&#xff0c;让运维监控人员有时…

oracle 自定义类型(type)的用法

emp表数据如下所示 定义object类型 create or replace type typeof_userinfo_row as object(user_id varchar2(50),user_name varchar2(50) )创建函数并将此类型作为返回值类型 create or replace function FUN_TEST return typeof_userinfo_row isFunctionResult typeof_use…

互联网业务全球化互通组网

随着互联网业务的快速发展&#xff0c;越来越多的企业开始全球化扩张业务&#xff0c;并需要在全球范围内建立互联网组网以实现业务数据的高效传输。在这个过程中&#xff0c;如何建立高效、稳定的全球互联网组网方案&#xff0c;是每个企业都需要考虑的问题。 一种可行的方案…

springboot 上传文件

在Spring Boot中&#xff0c;可以使用RequestParam注解来接收文件。 在你的控制器方法中&#xff0c;使用RequestParam注解来声明一个MultipartFile类型的参数来接收上传的文件 MultipartFile是spring类型&#xff0c;代表HTML中form data方式上传的文件&#xff0c;包含二进制…

【C语言操作符优先级】

C语言操作符优先级 C语言操作符1、操作符的优先级序表2、操作符的属性2.1、操作符优先级运算例程12.2、操作符优先级运算例程2 C语言操作符 前言&#xff1a; &#xff08;1&#xff09;在我们熟悉的数学加减乘除运算中&#xff0c;都知道先乘除再加减&#xff0c;有括号的先算…

Error: Cannot find module ‘webpack‘ 问题解决办法

这句话的意思是&#xff1a;没有找到webpack模块。 就算之前你装了webpack&#xff0c;那肯定是非全局安装 所以要全局安装 npm install --save-dev webpack 问题解决

数据库管理-第八十六期 19c OCM之路-第一堂(01)(20230628)

数据库管理 2023-06-28 第八十六期 19c OCM之路-第一堂&#xff08;01&#xff09;1 环境补充说明2 第一堂-01考点1&#xff1a;Create a pluggable database 创建PDB考点2&#xff1a;Create tablespace 创建表空间考点3&#xff1a;Managing undo 管理undo 总结 第八十六期 1…