(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

目录

1、享元模式(Flyweight Pattern)含义

2、享元模式的UML图学习

3、享元模式的应用场景

4、享元模式的优缺点

5、C++实现享元模式的简单实例


1、享元模式(Flyweight Pattern)含义

享元模式(Flyweight),运用共享技术有效地支持大量细粒度地对象。

(1)享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来最大程度地减少内存使用和提高性能。它适用于存在大量细粒度对象且这些对象之间有许多共享状态的情况。

(2)在享元模式中,将对象分为两种状态:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象固有的、不会随着外部环境变化而变化的状态,可以被多个对象共享;而外部状态是对象依赖的、可能随着外部环境变化而变化的状态,每个对象都需要单独维护。

(3)享元模式的核心思想是将可共享的内部状态从具体对象中提取出来,并将其存储在一个享元池(或缓存)中。当需要创建对象时,先检查享元池中是否已经存在相应的享元对象,如果存在则直接返回,如果不存在则创建新的享元对象并放入享元池中。客户端通过享元工厂来获取或操作享元对象,同时传递外部状态给享元对象进行处理。

2、享元模式的UML图学习

在享元模式中,主要包含以下几个角色:

(1)享元工厂(Flyweight Factory):负责创建和管理享元对象。它维护一个享元池(或缓存),用于存储已经创建的享元对象,并根据客户端的请求返回相应的享元对象。

(2)抽象享元(Flyweight):定义了享元对象的接口,声明了享元对象可以接收的外部状态参数。

(3)具体享元(Concrete Flyweight):实现了抽象享元接口,同时也包含内部状态。具体享元对象需要注意内部状态和外部状态的分离,确保内部状态是可共享的。

(4)UnshareConcreteFlyweight是指那些不需要共享地Flyweight子类。因为Flyweight接口共享成为可能,但它并不强制共享,解决那些不需要共享对象地问题。

(5)客户端(Client):通过享元工厂来获取或操作享元对象。客户端通常会维护一些外部状态,并将其传递给享元对象进行处理。

3、享元模式的应用场景

(1)系统中存在大量相似对象,且创建和销毁这些对象会消耗大量资源时,可以考虑使用享元模式来共享对象。

(2)对象的状态可以分为内部状态和外部状态,且内部状态相对稳定不变,而外部状态可变时,可以使用享元模式来共享内部状态,减少对象的数量。

4、享元模式的优缺点

(1)优点:

1)节省内存:通过共享对象,减少了系统中对象的数量,从而节省了内存空间。特别是当需要创建大量细粒度的对象时,享元模式可以显著减少内存的消耗。

2)提高性能:由于共享对象可以被多个客户端共享,因此可以减少对象的创建和销毁次数,提高了系统的性能。

3)支持可变状态和不可变状态:享元模式将对象的状态分为内部状态和外部状态,其中内部状态是不可变的,而外部状态是可变的。这样可以在一定程度上支持对象的可变性,同时保持了对象的共享性。

(2)缺点:

1)对象共享可能导致线程安全问题:如果多个线程同时访问并修改了共享对象的外部状态,就会出现线程安全问题。在使用享元模式时,需要注意对共享对象的并发访问进行合理的同步控制。

2)增加了系统的复杂性:引入享元模式会增加系统的复杂性,需要额外的工厂类来管理享元对象的创建和共享。这增加了代码的复杂性和维护成本。

总结: 享元模式通过共享对象来减少系统中对象的数量,从而节省了内存空间,并提高了系统的性能。然而,它也增加了系统的复杂性,并可能引入线程安全问题。在使用享元模式时,需要根据具体情况权衡利弊,合理设计和管理共享对象。

5、C++实现享元模式的简单实例


#include <iostream>
#include <unordered_map>// 抽象享元类
class Flyweight 
{
public:virtual void operation(int extrinsicState) = 0;
};// 具体享元类
class ConcreteFlyweight : public Flyweight 
{
public:void operation(int extrinsicState) override {std::cout << "具体享元对象,外部状态:" << extrinsicState << std::endl;}
};// 享元工厂类
class FlyweightFactory 
{
private:std::unordered_map<int, Flyweight*> flyweights;public:Flyweight* getFlyweight(int key){if (flyweights.find(key) == flyweights.end()) {flyweights[key] = new ConcreteFlyweight();}return flyweights[key];}
};int main() 
{FlyweightFactory factory;Flyweight* fw1 = factory.getFlyweight(1);fw1->operation(10);Flyweight* fw2 = factory.getFlyweight(2);fw2->operation(20);Flyweight* fw3 = factory.getFlyweight(1); // 从缓存中获取已有的享元对象fw3->operation(30);delete fw1;delete fw2;// 注意:不要删除fw3,因为它是从享元池中获取的对象,由享元工厂负责管理和销毁return 0;
}

在上述示例中,通过享元工厂(FlyweightFactory)创建和管理享元对象(ConcreteFlyweight)。客户端根据需要获取具体的享元对象,并传递外部状态给享元对象进行操作。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用系统命令

重定向 cat aa.txt > bbb.txt 将输出定向到bbb.txt cat aaa.txt >> bbb.txt 输出并追加查看进程 ps ps -ef 显示所有进程 例⼦&#xff1a;ps -ef | grep mysql |&#xff1a;管道符 kill pid 结束进程&#xff0c; 如 kill 3732&#xff1b;根据进程名结束进程可以先…

20英镑以上免费吗?英国亚马逊上调当日达订单免配送费门槛!

据外媒报道&#xff0c;英国亚马逊向Prime会员发送了一封电子邮件&#xff0c;通知他们从下个月开始必须为小额当日达订单支付运费。 亚马逊在向Prime用户发送的电子邮件中称&#xff0c;目前&#xff0c;其向符合条件的邮政编码内的Prime会员提供免费当日送达服务。 不过&am…

vue 实现图片懒加载

一&#xff1a;懒加载的目的 有些页面可能展示的是大量的图片&#xff0c;如果我们一次性加载所有图片就会浪费性能&#xff0c;影响用户体验&#xff0c;所以我们就会懒加载这些图片。即可视区域之外的图片不加载&#xff0c;随着页面的滚动&#xff0c;图片进入可视区域&…

Appium Desktop安装

【提示&#xff1a;官方已不再维护&#xff0c;建议命令行方式安装&#xff0c;但可以学习了解一下】 Appium Desktop是一款适用于Mac、Windows和Linux的应用程序&#xff0c;它以漂亮灵活的UI为您提供Appium自动化服务器的强大功能。它基本上是Appium Server的图形界面。您可…

Day8 智慧商城

项目演示 项目收获 创建项目 调整初始化目录 1.删components里的所有文件 2.删views里的所有文件 3.router/index.js 删路由 删规则 import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({routes: [] })export default route…

【Git】本地搭建Gitee、Github环境

本地 &#xff08;Local&#xff09; 1、使用命令生成公钥&#xff08;pub文件&#xff09; 1. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "github_id_rsa" 2. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "gitee_id_rsa" …

Rides分布式缓存

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题&#xff1a; 1.Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#x…

Flink 流式读写文件、文件夹

文章目录 一、flink 流式读取文件夹、文件二、flink 写入文件系统——StreamFileSink三、查看完整代码 一、flink 流式读取文件夹、文件 Apache Flink针对文件系统实现了一个可重置的source连接器&#xff0c;将文件看作流来读取数据。如下面的例子所示&#xff1a; StreamExe…

Java后端开发面试题——框架篇

Spring框架中的bean是单例的吗&#xff1f;Spring框架中的单例bean是线程安全的吗&#xff1f; singleton : bean在每个Spring IOC容器中只有一个实例。 prototype&#xff1a;一个bean的定义可以有多个实例。 Spring bean并没有可变的状态(比如Service类和DAO类)&#xff0c…

使用kubeadm工具升级kubernetes

一、背景&#xff1a; kubeadm部署的kubernetes集群进行升级&#xff0c;通常先升级控制节点&#xff0c;控制节点升级完成后再升级工作节点&#xff0c;本博文只升级了控制节点&#xff0c;工作节点按照相同的流程进行升级即可 环境说明&#xff1a; 主机名节点11.0.1.200k8s…

PyTorch DataLoader 报错 “DataLoader worker exited unexpectedly“ 的解决方案

注意&#xff1a;博主没有重写d2l的源代码文件&#xff0c;而是创建了一个新的python文件&#xff0c;并重写了该方法。 一、代码运行日志 C:\Users\Administrator\anaconda3\envs\limu\python.exe G:/PyCharmProjects/limu-d2l/ch03/softmax_regression.py Traceback (most r…

Ohio主题 - 创意组合和代理机构WordPress主题

Ohio主题是一个精心制作的多用途、简约、华丽、多功能的组合和创意展示主题&#xff0c;具有敏锐的用户体验&#xff0c;您需要构建一个现代且实用的网站&#xff0c;并开始销售您的产品和服务。它配备了最流行的WordPress页面构建器 WPBakery Page Builder&#xff08;以前称为…

avue多选列表根据后端返回的某个值去判断是否选中;avue-curd多选回显

效果如上&#xff1a; getSiteList().then(res > {//列表数据this.siteData res.data.datathis.$nextTick(()>{this.siteData.forEach(item>{//业务条件if(item.configid&&item.configid!0&&item.configid>0){//符合条件时调用选中的方法this.$…

OC调用Swift编写的framework

一、前言 随着swift趋向稳定&#xff0c;越来越多的公司都开始用swift来编写苹果相关的业务了&#xff0c;关于swift的利弊这里就不多说了。这里详细介绍OC调用swift编写的framework库的步骤 二、制作framework 1、新建项目&#xff0c;选择framework 2、填写framework的名称…

损失函数,基于概率分布度量的损失函数,信息量,信息熵的作用

目录 损失函数中为什么要用Log&#xff1a;概率损失函数-乘法转加法-便于求偏导 信息量&#xff0c;信息熵的作用 信息的作用是消除不确定性&#xff1a;信息量是0&#xff0c;事件确定 回答只是Y,N&#xff0c;因此对数底数为2​编辑 一句话描述的事件发生的概率越低&#…

隔断让你的办公室变得更加智能、环保、人性化

隔断可以在办公室中起到多种重要作用&#xff0c;使办公室更加智能、环保和人性化。以下是一些可能的方式&#xff1a; 1. 智能办公室控制系统&#xff1a;可以通过隔断集成智能办公室控制系统&#xff0c;实现办公室照明、温度和空调等设备的自动调节&#xff0c;提高能效和舒…

以 Java NIO 的角度理解 Netty

文章目录 前言Java NIO 工作原理Selector 的创建ServerSocketChannel 的创建ServerSocketChannel 注册 Selector对事件的处理总结 前言 上篇文章《Netty 入门指南》主要涵盖了 Netty 的入门知识&#xff0c;包括 Netty 的发展历程、核心功能与组件&#xff0c;并且通过实例演示…

用户信任建立:银行卡三要素API的隐私保护与数据安全

引言 在数字支付和金融领域&#xff0c;用户信任是构建稳健金融生态的关键。随着金融科技的迅速发展&#xff0c;银行卡三要素API作为一种用于身份验证和支付安全的工具&#xff0c;不仅带来了便利&#xff0c;也引发了对隐私保护和数据安全的关切。本文将探讨银行卡三要素API…

C语言编写图形界面

文章目录 环境使用库基础概念句柄 程序的入口创建窗口定义窗口类注册窗口类创建窗口 完整代码运行效果 环境 使用的是VSCode MinGW&#xff1b; 使用库 我们使用windows.h库来实现图形化界面。 头文件如下&#xff1a; #include <windows.h>windows.h是 Windows 操作…

Redis中的分布式锁及其延生的问题

前言 本文将着重介绍Redis中的分布式锁及其与出现的死锁和锁误删问题 什么是分布式锁 首先问题就是什么是分布式锁&#xff0c;分布式锁就是分布式系统中实现并发控制的一种锁机制&#xff0c;它可以保证多个节点在同一个时间只有有一个能成功竞争到系统资源&#xff08;共享…