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

devtools/2024/11/30 13:43:40/

在这里插入图片描述

二、结构型设计模式

7、享元模式(Flyweight Pattern)

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

享元模式的核心思想

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

享元模式的结构

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

享元模式的工作流程

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

享元模式的代码实现

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

php">// 享元接口
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、享元工厂类

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

php">在这里插入代码片class FlyweightFactory {private $flyweights = [];public function getFlyweight($key) {if (!isset($this->flyweights[$key])) {// 创建新的享元对象并缓存$this->flyweights[$key] = new ConcreteFlyweight($key);}return $this->flyweights[$key];}
}

3、客户端代码

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

php">// 客户端代码
$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: Arialecho $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、游戏开发:在大型多人在线游戏中,成千上万的玩家可能有相同的属性或行为,例如攻击动作、角色装备等,这些属性可以使用享元模式进行共享。

总结

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


http://www.ppmy.cn/devtools/138211.html

相关文章

RabbitMQ学习-Seven

再SpringBoot中使用MQ 1.创建SpringBoot项目 除了我们平常使用的一些工具依赖,还需要选择这个Spring for RabbitMQ依赖 2.需要在application.yml文件中进行配置 server:port :9090 spring:application:name:producerrabbitmq:host: 你的主机名port: 5672virtual-…

DRM(数字权限管理技术)防截屏录屏----解密org.w3.clearkey视频并播放

提示:解密org.w3.clearkey视频并播放 帮助:未实现clearkey加密,如有大神,请指导一下 文章目录 [TOC](文章目录) 前言一、教程二、org.w3.clearkey视频播放三、效果四、问题总结 前言 ‌‌ClearKey‌是一种基于JSON Web Key (JWK)格…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…

网络安全(1)_对称加密和非对称加密

1 网络安全概述 1.1 计算机网络面临的安全威协 (1)截获:攻击者从网络上窃听他人的通信内容,通常把这类攻击称为“截获”。在被动攻击中,攻击者只是观察和分析某一个协议数据单元(PDU)而不干扰信…

[Python/网络安全] Git漏洞之Githack工具基本安装及使用详析

前言 本文仅分享Githack工具基本安装及使用相关知识,不承担任何法律责任。 Git是一个非常流行的开源分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用Git作为其代码管理系统,并将其部署到生产环境中以维护其代…

基于单片机的智能药箱设计

本设计主要由红外检测传感器、显示、独立按键、舵机、语音以及短信等模块组成。红外传感器模块主要对药仓中的药物数据进行采集,采集完毕由主控制器进行数据加工,之后可传送至显示模块上进行显示,在显示模块也可对显示时间、吃药倒计时、吃药…

《软件项目管理》期末-复习题及参考答案

(1)赶工一个任务时,你应该关注( C ) A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 (2)下列哪个不是项目管理计划的一部分?&#x…

Vue.js 指令详解:v-bind, v-html, v-once, v-on, v-if, v-else-if, v-else 和 v-model

Vue.js 是一个用于构建用户界面的渐进式框架,它通过一系列的指令来实现数据与 DOM 的绑定。在本篇博客中,我们将通过一个示例来介绍 Vue 3 中的一些常用指令:v-bind, v-html, v-once, v-on, v-if, v-else-if, v-else 和 v-model。 1. v-bind…