设计模式:享元模式

2023-09-17 16:18:51

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最大程度地减少内存使用和提高性能。享元模式通过共享细粒度的对象,以有效地支持大量细粒度的对象实例。
在享元模式中,对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象共享的部分,它独立于对象的上下文环境。外部状态是对象的上下文环境,它不可共享并且会影响对象的行为。
享元模式通过将内部状态和外部状态分离,将内部状态存储在共享的数据结构中,以便多个对象可以共享相同的内部状态。这样可以减少内存使用,提高系统的性能。

组件

在享元模式中,通常包含以下组件:

  1. 享元接口(Flyweight Interface):定义享元对象的公共方法,可以是抽象类或接口。
  2. 具体享元(Concrete Flyweight):实现享元接口,并包含内部状态。具体享元对象可以被共享和重用。
  3. 享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(Flyweight Pool)用于存储已创建的享元对象,以便重复使用。
  4. 客户端(Client):使用享元对象的客户端代码。客户端可以通过享元工厂获取享元对象,并根据需要设置外部状态。

代码实现

import java.util.HashMap;
import java.util.Map;
 // 享元接口
interface Flyweight {
    void operation();
}
 // 具体享元类
class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;
     public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }
     public void operation() {
        System.out.println("具体享元对象,内部状态为:" + intrinsicState);
    }
}
 // 享元工厂类
class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();
     public Flyweight getFlyweight(String key) {
        if (flyweights.containsKey(key)) {
            return flyweights.get(key);
        } else {
            Flyweight flyweight = new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
            return flyweight;
        }
    }
}
 // 客户端代码
public class Main {
    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
         Flyweight flyweight1 = factory.getFlyweight("A");
        flyweight1.operation();
         Flyweight flyweight2 = factory.getFlyweight("B");
        flyweight2.operation();
    }
}

在上述示例中,我们定义了享元接口(Flyweight)和具体享元类(ConcreteFlyweight)。享元工厂类(FlyweightFactory)负责创建和管理享元对象,并使用一个HashMap来存储已创建的享元对象,以便重复使用。

在客户端代码中,我们通过享元工厂来获取享元对象,并调用其操作方法。注意到,虽然我们获取了两个享元对象,但它们的内部状态是相同的,因为它们共享了相同的享元对象。

源码中使用

在源码中,享元模式的应用有很多。以下是一些常见的源码中使用享元模式的情况:

  1. Java中的字符串常量池(String Pool):Java中的字符串常量池使用了享元模式的思想,相同的字符串只会在内存中保存一份,多个引用共享同一个字符串对象,以节省内存空间。
  2. 数据库连接池:数据库连接池使用了享元模式的概念,通过共享数据库连接对象,减少了创建和销毁连接的开销,提高了数据库操作的性能。
  3. 缓存实现:在缓存中,可以使用享元模式来存储和管理缓存对象。相同的数据只需保存一份,多个请求可以共享同一个缓存对象,提高了缓存的效率。
  4. 图形界面中的图元对象:在图形界面的绘图功能中,可以使用享元模式来共享图元对象,减少内存占用,提高绘图的性能。

总结

享元模式在源码中有广泛的应用,主要用于共享和复用对象,以减少内存使用和提高性能。通过共享对象,可以节省内存空间,并提高系统的响应速度。

更多推荐

数据在内存中的存储

文章目录一、整数在内存中的存储二、大小端引言大小端的介绍三、浮点数在内存中的存储储存规则取的过程一、整数在内存中的存储计算机中有3中二进制存储方法,即原码、补码、反码正整数的原码、反码、补码都相同负整数原码、反码、补码各不相同:原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。反码:将原码的符号位不变,其他位

华为数通方向HCIP-DataCom H12-831题库(单选题:81-100)

第81题关于结构化的网络故障排除流程中的确认故障阶段的描述,正确的是?A、应关注如何更好的解决故障而不论该故障是否属于自己的负责范围。B、应重视用户的意见,以用户的判断为依据来判断故障问题C、应使影响最小化,尽量不让其他人知道网络出现了故障。D、应确认排障工作是否属于自己的负责范围答案:D解析:当网络出现故障时,首先应

iOS技术博主指南:填写苹果应用上架中的隐私政策信息

摘要:本文将详细介绍iOS技术博主在苹果应用上架过程中如何填写隐私政策信息。博主可以通过AppStoreConnect为应用程序提供隐私政策网址和用户隐私选项网址,并了解如何填写隐私政策文本。本文将提供步骤和注意事项,帮助博主顺利完成隐私政策信息的填写。引言:为了保护用户的隐私权益,苹果要求所有上架的应用程序必须提供隐

计算机视觉与深度学习-全连接神经网络-训练过程-欠拟合、过拟合和Dropout- [北邮鲁鹏]

目录标题机器学习的根本问题过拟合overfitting泛化能力差。应对过拟合最优方案次优方案调节模型大小约束模型权重,即权重正则化(常用的有L1、L2正则化)L1正则化L2正则化对异常值的敏感性随机失活(Dropout)随机失活的问题欠拟合机器学习的根本问题机器学习的根本问题是优化与泛化问题。优化:是指调节模型以在训练

Arcgis提取每个像元的多波段反射率值

Arcgis提取每个像元的多波段反射率值数据预处理数据预处理阶段需要对遥感图像进行编辑传感器参数、辐射定标、大气校正、正射校正,具体流程见该文章裁剪研究区对于ENVI处理得到的tiff影像,虽然是经过裁剪了,但是还存在黑色的背景值,此时需要用按掩膜提取的方法删除研究区以外的部分。该方法的具体流程在文章中提到然后还需要对

【C++】map,set简单操作的封装实现(利用红黑树)

文章目录一、STL中set与map的源码二、红黑树结点的意义三、仿函数的妙用四、set,map定义迭代器的区别五、map,set迭代器的基本操作:1.begin()end()2.operator++3.operator--六、迭代器拷贝构造特殊处理7.源码RBTree.h2.MyMap.h3.MySet.h一、STL中

贝叶斯人工智能大脑与 ChatGPT

文章目录一、前言二、主要内容🍉CSDN叶庭云:https://yetingyun.blog.csdn.net/一、前言论文地址:https://arxiv.org/abs/2308.14732这篇论文旨在研究ChatGenerativePre-trainedTransformer(ChatGPT)在贝叶斯推理情况下解

List与ArrayList

目录一、List及其使用1.1List的概念1.2常见接口的介绍1.3List的使用二、线性表和顺序表2.1线性表2.2顺序表三、ArrayList介绍四、ArrayList的使用4.1ArrayList构造4.2ArrayList的常用方法4.3ArrayList的遍历4.4ArrayList的扩容机制五、Array

三分钟图解事务隔离级别

详细见:三分钟图解事务隔离级别,看一遍就懂数据库中事务指的是什么“锁"是数据库系统区别于文件系统的一个关键特性,其对象是事务,用来锁定的是数据库中的对象,如表、页、行等。锁确实提高了并发性,但是却不可避免地存在一些潜在的并发一致性问题。不过好在锁只会带来四种问题(丢失更新、脏读、不可重复读、幻读),如果可以防止这四种情

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏:提升自身的硬实力:汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用CSDN平台,自主完成项目设计升级,提升自身的硬实力。专栏订阅:项目大全提升自身的硬实力资料合集更优惠第一期资料合集:https://download.csdn.net/download/sinat_39620217/8

一文详解 requests 库中 json 参数和 data 参数的用法

在requests库当中,requests请求方法,当发送post/put/delete等带有请求体的请求时,有json和data2个参数可选。众所周知,http请求的请求体格式主要有以下4种:application/jsonapplicaiton/x-www-from-urlencodedmultipart/form

热文推荐