金三银四面试题(二十四):享元模式知多少?

news2024/11/23 8:34:59

什么是享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来减少内存使用,从而提高性能。它主要用于处理大量细粒度对象的情况,通过将这些对象的可共享部分(内部状态)集中起来存储,以便多个对象可以共享这些部分,从而节省内存。

享元模式的特点

  1. 共享内部状态:享元模式中的对象将内部状态分为共享的和非共享的。共享的内部状态是可以在多个对象之间共享的,例如颜色、形状等,这些状态通常存储在享元工厂中,并由多个享元对象共享。

  2. 外部状态:非共享的状态称为外部状态,它通常是每个对象的独特状态,在使用享元对象时由客户端提供。

  3. 享元工厂:享元模式通常通过一个享元工厂来创建和管理享元对象。工厂会检查对象是否已经存在,如果已经存在,就返回现有对象;如果不存在,则创建一个新对象。

  4. 对象池:享元工厂通常使用一个对象池来存储共享的对象,以便复用这些对象。

应用场景

  • 当应用程序需要处理大量细粒度对象时。
  • 对象的大量创建会导致内存消耗过多。
  • 对象的可共享状态可以提取出来,并在多个对象之间共享。
  • 外部状态可以从对象中移出,并传递给享元对象的客户端。

优点

  • 节省内存:通过共享对象,减少了对象的数量,从而节省了内存。
  • 提高性能:由于对象的复用,减少了对象的创建和销毁,提高了性能。

缺点

  • 需要仔细分析哪些状态可以共享,否则可能导致代码复杂。
  • 如果外部状态处理不当,可能会导致线程安全问题。

举个例子

import java.util.HashMap;
import java.util.Map;

// 享元接口
interface Flyweight {
    void operation(String externalState);
}

// 具体享元类
class ConcreteFlyweight implements Flyweight {
    private final String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    @Override
    public void operation(String externalState) {
        System.out.println("Intrinsic state: " + intrinsicState + ", External state: " + externalState);
    }
}

// 享元工厂
class FlyweightFactory {
    private final Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        Flyweight flyweight = flyweights.get(key);
        if (flyweight == null) {
            flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }

    public int getFlyweightCount() {
        return flyweights.size();
    }
}

// 客户端代码
public class FlyweightPatternDemo {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();

        // 获取享元对象并执行操作
        Flyweight flyweight1 = factory.getFlyweight("State1");
        flyweight1.operation("External1");

        Flyweight flyweight2 = factory.getFlyweight("State1");
        flyweight2.operation("External2");

        Flyweight flyweight3 = factory.getFlyweight("State2");
        flyweight3.operation("External1");

        // 显示享元对象的数量
        System.out.println("Number of flyweight objects: " + factory.getFlyweightCount());
    }
}

在这个示例中,FlyweightFactory 是享元工厂,它通过键(状态)来管理享元对象。当客户端请求一个享元对象时,工厂会返回现有对象或创建一个新对象。ConcreteFlyweight 是具体享元类,它有一个内在状态,可以在多个对象之间共享。

思考

享元模式和单例模式是如此相像,那么区别是什么?

往期推荐

金三银四面试题(二十一):代理模式知多少?2024-04-16
金三银四面试题(二十):单例模式知多少?2024-04-15
金三银四面试题(十九):MySQL中的锁2024-04-09
MySQL基础练习题:习题7-112024-04-09
金三银四面试题(十八):MySQL索引2024-04-08
MySQL基础练习题:习题4562024-04-08
金三银四面试题(十七):MySQL面试都问什么(2)2024-04-07
MySQL基础练习题:习题2-32024-04-07
MySQL基础练习题:创建数据库2024-04-07
金三银四面试题(十六):MySQL面试都问什么(1)2024-04-07

在这里插入图片描述

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

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

相关文章

“A”分考试经验分享:云计算HCIE考试请注意这几点...

大家好&#xff0c;我是誉天云计算HCIE的王同学&#xff0c;于4月2日"A"分通过了云计算3.0 HCIE的认证考试。 首先感谢誉天教育对我的辅导&#xff0c;感谢苗苗老师和石老师对我的帮助&#xff0c;通过这次考试让我对华为云计算有了一定的了解。接下来我就与大家分享…

嵌入式C语言教程:实现气压监测系统

气压监测在气象学、航空和户外活动装备中非常重要。本教程将介绍如何在STM32微控制器上使用数字气压传感器实现实时气压监测系统。 一、开发环境准备 硬件要求 微控制器&#xff1a;STM32L476RG&#xff0c;具备低功耗特性和足够的处理能力。开发板&#xff1a;STM32L4 Disc…

“40法则”视角下的中国网络安全公司

“40法则”视角下国内网安上市公司2023年业绩表现 采用“40法则”衡量&#xff0c;首先需要考虑的是营收增长和利润水平的衡量指标&#xff0c;在上一篇文章中已经详细说明&#xff0c;在此不再赘述。 增长速度的衡量指标&#xff0c;可以选择公司的营业收入的同比增长率。 …

软考 系统架构设计师系列知识点之软件可靠性基础知识(11)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之软件可靠性基础知识&#xff08;10&#xff09; 所属章节&#xff1a; 第9章. 软件可靠性基础知识 第2节 软件可靠性建模 9.2.3 软件可靠性模型模型分类 一个有效的软件可靠性模型应尽可能地将前文所述的因素在软件可…

deepin 社区月报 | 2024年4月,多款应用更新,还有线下相见!

deepin&#xff08;深度&#xff09;社区4月总览 2024年4月&#xff0c;有1131位小伙伴加入了deepin&#xff08;深度&#xff09;社区大家庭&#xff0c;目前共有论坛伙伴153,910位&#xff1b; 在4月&#xff0c;deepin V23 Beta3共进行了2次内测更新&#xff0c;共新增与更…

十七岁少女夸小沈阳:我瞅你长得有一种大海的感觉呢!

十七岁少女夸小沈阳&#xff1a;我瞅你长得有一种大海的感觉呢&#xff01; ——小品《超级大明星》&#xff08;上&#xff09;的台词 小沈阳&#xff1a;THANK YOU 哦了 不用拍 感谢大家 非常的感谢所有的好朋友们 把你们热情而洋溢的掌声呢 送给我们所有的演员 这…

手把手教你上手开源性能监控神器Arthas

前言 在日常的工作中&#xff0c;对于商业项目尤其是并发量较高的项目&#xff0c;系统在一些情况下会莫名其妙把CPU打满并且导致服务宕机&#xff0c;虽然90%的情况下&#xff0c;是迭代发版的代码有bug&#xff0c;但是既然有这个情况&#xff0c;线上出现事故了&#xff0c…

scrapy5

Pandas Pandas 是一个 Python 库&#xff0c;它提供灵活的数据结构&#xff0c;使我们与数据的交互变得非常容易。我们将使用它将数据保存在 CSV 文件中。 obj{}arr[]obj[“name”] soup.find(“span”,{“class”:”a-size-large product-title-word-break”}).text.lstrip()…

保研面试408复习 3——操作系统

文章目录 1、操作系统一、进程有哪几种状态&#xff0c;状态之间的转换、二、调度策略a.处理机调度分为三级&#xff1a;b.调度算法 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 为什么越写越少&#xff1f; 问就是在打瓦。(bushi) 1、操作系统 一、进程…

【毕业设计】基于微信小程序的校园快递平台系统设计与实现

1.项目介绍 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园快递平台系统信息管理难度大&#xff0c;容错率…

【操作指南】银河麒麟高级服务器操作系统内核升级——基于4.19.90-17升级

1. 升级清单 升级包及依赖包清单如下。 kernel ARM架构 kernel-core-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-4.19.90-23.18.v2101.ky10.aarch64.rpm kernel-modules-extra-4.19.90-23.18.v2101.ky10.aarch64.r…

论文阅读-THE GENERALIZATION GAP IN OFFLINE REINFORCEMENT LEARNING(ICLR 2024)

1.Motivation 本文希望比较online RL、offline RL、序列决策和BC等方法的泛化能力(对于不同的初始状态、transition functions、reward functions&#xff0c;现阶段offline RL训练的方式都是在同一个环境下的数据集进行训练)。实验发现offline的算法相较于online算法对新环境…

某制造公司屋顶分布式光伏发电案例分享--分布式光伏电力监控系统解决方案

安科瑞薛瑶瑶18701709087/17343930412 ★分布式光伏监控系统 分布式光伏监控电力系统遵循安全可靠、经济合理原则&#xff0c;满足电力系统自动化总体规划要求&#xff0c;且充分考虑光伏发电的因素&#xff0c;对分布式光伏发电、用电进行集中监控、统一调度、统一运维、满足…

LeetCode 面试经典150题 228.汇总区间

题目&#xff1a; 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区…

网络技术-链路层可靠传输协议

可靠传输 在链路层传输中&#xff0c;可能出现的错误包括数据位出错、分组丢失、分组失序、分组重复等。可靠传输服务希望实现发送端发送什么&#xff0c;接收端就接收到什么。虽然下面将在链路层这一章节中介绍SW、GBN、SR三种协议&#xff0c;但要明确的是&#xff0c;可靠传…

山东省文史书画研究会成立20周年系列活动徽标征集胜选名单公布

2024年5月1日&#xff0c;山东省文史书画研究会成立20周年系列活动徽标征集落下帷幕。征稿启事下发后&#xff0c;得到社会各界人士的广泛关注与参与&#xff0c;共收到设计方案608件。经过初评&#xff0c;选出5幅作品进入复评&#xff0c;并经过网络投票和专家投票相结合的方…

Fluence Developer Rewards 国内 每个账号收2000元

# 国内有金主支持 每个账号收2000元 Fluence Developer Rewards account_line 白名单见附件 # 感兴趣的请留言 或加微信 Fluence Developer Rewards This repo allows one to generate a proof signature for Fluence dev reward claiming. 感兴趣 Caution Beware of s…

【Oracle】Linux x86-64 安装Oracle 23AI指南

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 前言 在信息技术日新月异的今天&#xff0c;企业级数据库系统扮演着数据管理与业务支撑的核心角色。Oracle数据库&#xff0c;作为全球…

智慧校园整体解决方案

智慧校园囊括了校园事务的各个方面&#xff0c;同时&#xff0c;智慧校园又是所有相关子系统的数据输出与枢纽。可以看出&#xff0c;智慧校园是一个大而全的系统。鉴于此&#xff0c;智慧校园的模块众多&#xff0c;本文将智慧校园的所有模块做出大致梳理&#xff0c;以完整支…

C++缺省参数、函数重载、引用

一、缺省参数 1.1缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void func(int n 0) {cout << n << endl; }int main() {func();func…