从0开始学PHP面向对象内容之常用设计模式(享元)

在这里插入图片描述

二、结构型设计模式

7、享元模式(Flyweight Pattern)

这里是引用享元模式(Flyweight Pattern) 是一种结构型设计模式,旨在通过共享对象来减少内存使用,尤其适用于大量相似对象的场景。通过共享和重用对象的不可变部分(内部状态),从而减少重复对象的创建,节省内存。享元模式通过将对象的状态分为内部状态和外部状态,并共享内部状态,来优化内存使用。

享元模式的核心思想

享元模式的核心思想是共享对象,将多个对象的共同部分提取出来,避免内存中存在多个相同的实例对象。每个享元对象都包含
内部状态:对象本身的状态,是可以共享的
外部状态:与对象行为相关的状态,每个对象实例可能是不同的,无法共享。通过这种方式,多个相同的对象可以共享相同的内部状态,儿不同的外部状态通过外部喜传入。

享元模式的结构

享元模式通常由以下几个组成部分构成
1、Flyweight(享元接口):定义共享对象的接口,通常具有operation()方法,接受外部状态。
2、ConcreteFlyweight(具体享元):实现享元接口的具体类,通常会存储共享内部状态。
3、FlyweightFactory(享元工厂):负责创建和管理享元对象,确保对象的复用。当请求一个享元对象时,它会检查对象池中是否已有共享的对象,如果没有,就创建一个新的对象。
4、Client(客户端):负责给享元对象提供外部状态,并使用享元对象进行操作。

享元模式的工作流程

1、创建共享对象:当客户端请求一个对象时,享元工厂会检查是否已有相同的对象。如果有,就返回已存在的对象;如果没有,则创建新的对象。
2、共享内部状态:相同的享元对象共享内部状态,不同的对象实例通过外部状态来区分。
3、减少内存消耗:通过复用相同的对象,减少了不必要的对象创建,从而降低了内存消耗。

享元模式的代码实现

以下是一个使用享元模式的示例,假设我们有多个不同的字符对象,每个字符都有不同的外部状态(如位置、字体等),但字符的实际内容(如’A’、'B’等)是共享的内部状态。
1、定义享元接口和具体享元类

// 享元接口
interface Flyweight {
    public function operation($extrinsicState);
}

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

    public function __construct($intrinsicState) {
        $this->intrinsicState = $intrinsicState;
    }

    public function operation($extrinsicState) {
        // 操作内部状态与外部状态
        return "IntrinsicState: " . $this->intrinsicState . ", ExtrinsicState: " . $extrinsicState;
    }
}

2、享元工厂类

享元工厂类负责管理享元对象池,确保共享的对象不会重复创建。

在这里插入代码片class FlyweightFactory {
    private $flyweights = [];

    public function getFlyweight($key) {
        if (!isset($this->flyweights[$key])) {
            // 创建新的享元对象并缓存
            $this->flyweights[$key] = new ConcreteFlyweight($key);
        }
        return $this->flyweights[$key];
    }
}

3、客户端代码

客户端通过享元工厂获取共享对象,并传入外部状态来使用享元对象。

// 客户端代码
$factory = new FlyweightFactory();

// 获取享元对象
$flyweight1 = $factory->getFlyweight("A");
$flyweight2 = $factory->getFlyweight("B");

// 使用享元对象
echo $flyweight1->operation("Position: (10, 20), Font: Arial") . PHP_EOL;  
// 输出: IntrinsicState: A, ExtrinsicState: Position: (10, 20), Font: Arial

echo $flyweight2->operation("Position: (30, 40), Font: Times New Roman") . PHP_EOL;
// 输出: IntrinsicState: B, ExtrinsicState: Position: (30, 40), Font: Times New Roman

享元模式的优缺点

优点:

1、节省内存:通过共享对象,避免了重复创建相同的对象,从而节省内存。
2、提高性能:减少了内存的使用和对象创建的开销,提高了系统的性能。
3、灵活性和扩展性:通过外部状态的传入,客户端可以在不改变内部状态的情况下,动态地改变对象的行为。

缺点:

1、增加复杂度:需要将对象分为内部状态和外部状态,代码实现较为复杂。
2、难以管理:享元工厂类需要管理共享对象池,随着对象数量的增多,管理起来可能变得比较复杂。
3、外部状态的管理:在享元模式中,外部状态是传递给对象的,这可能需要额外的管理逻辑来确保对象的一致性。

适用场景

1、内存消耗大的系统:当需要创建大量相似对象时,使用享元模式可以显著减少内存使用。
2、对象状态可以分为内部和外部的情况:当对象的内部状态是可以共享的,而外部状态是可变的时,享元模式非常适用。
3、对象数量庞大且有相似性的场景:如文本编辑器中的字符对象、图形绘制中的图形对象等。

实际应用

1、文本编辑器:在文本编辑器中,字符是可以共享的,因为字符本身(如A、B)是固定的,然而每个字符的字体、大小、颜色等属性(外部状态)是不同的。
2、游戏开发:在大型多人在线游戏中,成千上万的玩家可能有相同的属性或行为,例如攻击动作、角色装备等,这些属性可以使用享元模式进行共享。

总结

关于设计模式中的结构型设计模式告一段落了 ,下期开启设计模式中的行为型设计模式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI开发 - GPT之魂 用Python 演示chatGPT的自注意力机制 - 机器学习

自注意力机制(Self-Attention)就是让模型在处理每个词时,学会“关注重点”,而不是平均地对每个词一视同仁。这种机制让 GPT 能更聪明地理解句子的上下文和语义之间的关系。 自注意力机制是 GPT 的核心,它帮助模型在理解…

循环神经网络(RNN)简述

RNN及其变体 1、概述 (一)、概念 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出。 RNN的循环机制使模型隐层**上一时间步产生的结果, 能够作为当下时间步…

计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

Next.js-样式处理

#题引:我认为跟着官方文档学习不会走歪路 Next.js 支持多种为应用程序添加样式的方法,包括: CSS Modules:创建局部作用域的 CSS 类,避免命名冲突并提高可维护性。全局 CSS:使用简单,对于有传统…

QT:多ui界面显示

文章目录 1.多ui界面添加2.跳转函数3.返回函数4.Qt5源码工程5.模态显示 1.多ui界面添加 最终生成这个目录 2.跳转函数 void MainWindow::on_pushButton_clicked() {//this->setWindowModality(Qt::WindowModal);test1 *t1 new test1();t1->setParentData(this);this-…

利用大数据和人工智能彻底改变移动测试

移动应用程序是按需提供的公司品牌。它是了解组织提供的任何服务或产品的窗口。在 Kobiton,他们明白这一点 — 他们的使命是通过测试改进移动应用程序。Kobiton 是一个移动测试平台,允许客户在世界任何地方对真实移动设备执行手动和自动测试。它最初是一…

Ubuntu环境中RocketMQ安装教程

参考教程 https://blog.csdn.net/weixin_56219549/article/details/126143231 1、安装JDK,并配置环境变量(略) 2、下载RocketMQ安装包 RocketMQ下载地址,选择二进制包下载 unzip rocketmq-all-5.0.0-ALPHA-bin-release.zip 使…

基于JAVA的旅游网站系统设计

摘 要 自改革开放以来, 我国国内旅游业发展迅速,覆盖面广,但总的来说仍然处于一种低消费、大众化、低水平、 中近距离旅游的状况。旅游基础设备、服务设施建设发展很快,但仍然不能适应国内旅游发展速度的要求。我国的 旅游业是在…

服务器数据恢复—raid6阵列硬盘被误重组为raid5阵列的数据恢复案例

服务器存储数据恢复环境: 存储中有一组由12块硬盘组建的RAID6阵列,上层linux操作系统EXT3文件系统,该存储划分3个LUN。 服务器存储故障&分析: 存储中RAID6阵列不可用。为了抢救数据,运维人员使用原始RAID中的部分…

论文笔记-WWW2024-ClickPrompt

论文笔记-WWW2024-ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction ClickPrompt: CTR模型是大模型适配CTR预测任务的强大提示生成器摘要1.引言2.预备知识2.1传统CTR预测2.2基于PLM的CTR预测 3.方法3.1概述3.2模态转换3.…

循环神经网络(RNN)详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【微服务】Nacos

一、安装 1、官网地址:https://nacos.io/download/nacos-server/ 2、启动:找到bin目录下的startup.cmd双击启动,或者打开一个命令窗口输入: startup.cmd -m standalone双击启动后如下:可以访问控制台地址 访问后的…

混沌工程/混沌测试/云原生测试/云平台测试

背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …

DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试,于是配置并记录了一下: 首先运行ros接口的dm-vio,一定要先配置源码 https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压,并安装一下依赖: sudo apt-get install …

自动化运维(k8s)之微服务信息自动抓取:namespaceName、deploymentName等全解析

前言:公司云原生k8s二开工程师发了一串通用性命令用来查询以下数值,我想着能不能将这命令写成一个自动化脚本。 起初设计的 版本一:开头加一条环境变量,执行脚本后,提示输入:需要查询的命名空间&#xff0c…

【数据分析】布朗运动(维纳过程)

文章目录 一、概述二、数学布朗运动2.1 数学定义2.2 布朗运动的数学模型2.21 标准布朗运动2.22 布朗运动的路径2.23 布朗运动的方程 三、布朗运动在金融学中的应用四、数学构造(以傅里叶级数为例)4.1 傅里叶级数的基本思想4.2 构造布朗运动 一、概述 布…

Mybatis Plus 增删改查方法(一、增)

先定义一个简单的测试表,执行脚本如下: create table user(id bigint primary key auto_increment,name varchar(255) not null,age int not null default 0 check (age > 0) ); 根据Spingbootmybatisplus的结构根据表自行构建结构,大致…

基于Matlab的图像去噪算法仿真(二)

在信息化的社会里,图像在信息传播中所起的作用越来越大。所以,消除在图像采集和传输过程中而产生的噪声,保证图像受污染度最小,成了数字图像处理领域里的重要部分。 本文主要研究分析邻域平均法、中值滤波法、维纳滤波法及模糊小…

鸿蒙Next星河版基础代码

目录: 1、鸿蒙箭头函数的写法2、鸿蒙数据类型的定义3、枚举的定义以及使用4、position绝对定位及层级zIndex5、字符串的拼接转换以及数据的处理(1)字符串转数字(2)数字转字符串(3)布尔值转换情况(4)数组的增删改查 6、三元表达式7、鸿蒙for循环的几种写法7.1、基本用…

Node.js的url模块与querystring模块

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 4.3.1 http模块——创建HTTP服务器、客户端 要使用http模块&#xff0…