首页 > 其他分享 >设计模式--享元模式

设计模式--享元模式

时间:2024-08-29 17:51:16浏览次数:6  
标签:享元 状态 -- 对象 Flyweight 共享 设计模式 intrinsicState

享元模式(Flyweight Pattern)是一种结构型设计模式,其主要目的是通过共享对象来有效地支持大量细粒度的对象,从而节省内存和提高性能。它特别适用于需要大量相似对象的情况,这些对象之间共享一些公共状态或数据。

享元模式的关键概念

  1. 享元(Flyweight):享元模式中的对象,这些对象可以共享某些数据以减少内存占用。享元对象通常分为两种状态:

    • 内部状态:可以被多个对象共享的状态,通常是不变的。
    • 外部状态:特定于某个对象的状态,每个对象都有自己的外部状态。
  2. 享元工厂(Flyweight Factory):负责管理和维护享元对象的共享。工厂类会根据请求返回已经存在的享元对象,或者创建新的享元对象(如果不存在的话)。

  3. 客户端(Client):使用享元对象,通常将对象的外部状态传递给享元对象。

结构

  1. Flyweight:抽象的享元类,定义了用于存储共享状态的接口。
  2. ConcreteFlyweight:实现了Flyweight接口的具体享元类,存储实际的共享状态。
  3. FlyweightFactory:创建和管理ConcreteFlyweight对象,确保享元对象的共享。
  4. UnsharedConcreteFlyweight:存储不需要共享的状态,通常用于存储外部状态。

示例

以下是一个简单的享元模式的Java示例:

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

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

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

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

    @Override
    public void operation(String extrinsicState) {
        System.out.println("Intrinsic State: " + intrinsicState + ", Extrinsic State: " + extrinsicState);
    }
}

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

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

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

        Flyweight flyweight1 = factory.getFlyweight("State1");
        flyweight1.operation("Context1");

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

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

应用场景

  • 大量对象的共享:当系统中需要创建大量相似的对象时,使用享元模式可以有效地减少内存开销。例如,大量相同字体的字符、图形元素等。
  • 对象的共享和重用:当对象具有大量共享状态并且外部状态不同的情况时,享元模式非常有用。通过共享对象,可以避免重复创建相同的对象实例。

优点

  • 节省内存:通过共享相同的对象实例,减少了内存的消耗。
  • 提高性能:减少了对象的创建和管理开销,提高了系统性能。
  • 支持大量细粒度对象:适用于需要大量相似对象的系统。

缺点

  • 实现复杂:需要维护共享对象的管理机制,增加了系统的复杂性。
  • 线程安全:在多线程环境下,享元模式的实现需要考虑线程安全问题,以避免数据的不一致性。

享元模式是一种高效的设计模式,通过对象的共享来优化系统的内存和性能。

标签:享元,状态,--,对象,Flyweight,共享,设计模式,intrinsicState
From: https://blog.csdn.net/m0_62965917/article/details/141683775

相关文章

  • Datawhale AI 夏令营-CV 方向-Task 2
    一、baseline上分思路1.数据集划分1.1原划分代码pyimportosimportcv2importpandasaspdimportglobdefsetup_directories():base_dir="yolo-dataset"subdirs=["train","val"]forsubdirinsubdirs:dir_path=os.pa......
  • [每日一练]查询结果的质量和占比(布尔值的灵活使用)
    题目来源于力扣:1211.查询结果的质量和占比-力扣(LeetCode)题目要求:Queries表:+-------------+---------+|ColumnName|Type|+-------------+---------+|query_name|varchar||result|varchar||position|int||rating|int......
  • AI 大模型在文本生成任务中的创新应用
    目录前言一、文本生成技术的最新进展1.1从规则到深度学习:文本生成技术的演变1.2大型语言模型的崛起:从GPT-3到GPT-41.3创新技术推动文本生成质量提升二、文本生成的创新应用案例分析2.1自动内容创作2.2智能对话系统2.3个性化内容推荐三、高质量文本生成的代......
  • FTP上传日志文件
    1、/***d) 更新上传日志文件(把最新上传的“模号/文件名称”覆盖到LastFtpFile.log),*ftp://10.210.85.249/LastFtpFile.log,log内容举例:P10123-1/mcn-2300707-001.xlsx,*多条数据时换行存储。*/privatevoidupdateLog(String[]modelingNoArr,Li......
  • 线程池ThreadPool, C++
    一、为什么要有线程池?线程池是一种用于管理和复用线程的机制。它可以提高程序的性能和效率,特别是在处理大量并发任务时。线程池中包含一定数量的线程,这些线程可以重复执行多个任务。当有任务需要执行时,可以将任务提交给线程池,线程池会选择一个可用的线程来执行任务。任务执行完......
  • Qcom高通平台抓取wifi fw/driver + sniffer log
    抓取WLANDRIVER+WLANFW3日志进入开发者模式打开启动WLAN详细日志记录功能操作完之后,日志会保存在/data/vendor/wifi目录下adbpull出来压缩wifi.zip//WCNSS_qcom_cfg.ini#Firmwarelogmode#Validvaluesare0,1,2#0=Disable,1=WMI,2=DIAGgEnablefwlog=1orgEn......
  • 29:函数查询,添加,修改,删除
    #_*_coding:utf-8_*_importosdeffile_handle(filename,backend_data,record_list=None,type='fetch'):#type:fetchappendchangenew_file=filename+'_new'bak_file=filename+'_bak'iftype=='fetch':......
  • 鸿蒙HarmonyOS自定义组件开发和使用_鸿蒙自定义组件
    自定义组件的介绍在开发和使用自定义组件直接,我们需要了解什么是自定义组件?在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行UI界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后......
  • Foxmail超大附件启动不了解决方法
    之前添加了几次QQ邮箱的账号密码,显示账号密码错误,无法启动。以为是我输错了呢,换了几个账号密码也不行。在网上搜索许久终于找到了解决办法。解决方案如下:1、先禁用腾讯企业邮箱超大附件插件功能。 2、删除foxmail安装目录下的domain文件,此文件所在位置:Foxmail7.2\Global\doma......
  • 点击“编辑”后取消,再点击“新增”模态框中出现“编辑”的内容
    VUE3+element-ui项目中,点击点击“编辑”弹出模态框后取消,再点击“新增”模态框中出现“编辑”的内容。原代码:consthandleEdit=(row)=>{dialogVisible.value=trueaction.value='edit'//做一个浅拷贝,把当前行数据显示出来,对sex做一个字符串的转换Objec......