设计模式:享元模式

2023-09-21 17:42:29

享元模式(Flyweight Pattern)是一种用于效率的优化模式,主要用于减少创建对象的数量,以减少内存占用和提高性能。它适用于那些需要大量使用相似对象,但又不需要每个对象都拥有完全独立的状态的情况。

在享元模式中,我们将对象分为两个部分:内部状态和外部状态。内部状态是存储在享元对象中的,并且可以被多个享元对象共享。而外部状态是需要时常改变的,不能共享,因此每个享元对象都有自己独立的外部状态。

下面是一个使用PHP实现的享元模式的例子:

<?php  
  
// 享元对象  
class Flyweight  
{  
    private $internalState; // 内部状态  
    private $externalState; // 外部状态  
  
    public function __construct($internalState)  
    {  
        $this->internalState = $internalState;  
    }  
  
    public function setExternalState($externalState)  
    {  
        $this->externalState = $externalState;  
    }  
  
    public function getExternalState()  
    {  
        return $this->externalState;  
    }  
  
    public function getInternalState()  
    {  
        return $this->internalState;  
    }  
}  
  
// 享元工厂  
class FlyweightFactory  
{  
    private $flyweights = []; // 存储享元对象的数组  
  
    public function getFlyweight($internalState)  
    {  
        if (!isset($this->flyweights[$internalState])) {  
            $this->flyweights[$internalState] = new Flyweight($internalState); // 如果不存在,则创建一个新的享元对象  
        }  
        return $this->flyweights[$internalState]; // 返回享元对象  
    }  
}  
  
// 客户端代码  
$factory = new FlyweightFactory();  
$flyweight1 = $factory->getFlyweight('A'); // 获取内部状态为 'A' 的享元对象  
$flyweight2 = $factory->getFlyweight('B'); // 获取内部状态为 'B' 的享元对象  
$flyweight1->setExternalState('X'); // 设置外部状态为 'X'  
$flyweight2->setExternalState('Y'); // 设置外部状态为 'Y'  
echo $flyweight1->getExternalState(); // 输出 'X'  
echo $flyweight2->getExternalState(); // 输出 'Y'v

在这个例子中,Flyweight 类表示享元对象,具有内部状态和外部状态。FlyweightFactory 类是享元工厂,用于创建和管理享元对象。当客户端需要一个特定内部状态的享元对象时,它可以从工厂中获取一个已经存在的对象,或者让工厂创建一个新的对象。这样,相似的对象可以被共享,从而节省内存和提高性能。

更多推荐

ram和rom的区别

ram和rom的区别主要在于:1、性质不同;2、特点不同;3、应用不同。其中性质不同是指RAM是随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器,而ROM是只读存储器,以非破坏性读出方式工作,只能读出无法写入信息。1、性质不同RAM是随机存取存储器,也叫主存,是与CPU直接交换数据的内部存储器。RAM(ra

地下城规划3d全景vr虚拟现实制作提高沟通效率

地下空间的合理有序开发,不仅形成了强劲的城市发展脉动,也为人们玩转地下空间“潮”生活提供了可能,因此为了更好宣传城市地下空间,引进web3d开发和VR全景制作技术,开发的城市地下空间3D全景虚拟漫游系统为客户提供线上、全新、丰富的交互体验。城市地下空间3D全景虚拟漫游让我们能够全方位、无死角地探索城市地下的神秘世界。进

Ansible自动化:简化你的运维任务

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

PyTorch深度学习(六)【循环神经网络-基础】

RNNCell:h0和x1生成h1,把h1作为输出送到下一次的RNNCell里面。(h1=linear(h0,x1))RNN计算过程:输入先做线性变换,循环神经网络常用的激活函数是tanh(±1区间)。构造RNNCell:代码:importtorch​batch_size=1seq_len=3input_size=4h

C++ Qt零基础入门进阶与企业级项目实战教程与学习方法分享

Qt是一个卓越的客户端跨平台开发框架,可以在Windows、Linux、macOS进行客户端开发,无缝切换,一统三端;当然除了桌面端,在移动端的早期,Qt也展现了其多才多艺,在Android和ios也可以使用Qt编写app,近些年移动端的蓬勃发展,大浪淘沙,Qt已退出移动端开发的舞台,但是在桌面端开发,尤其是跨平台方面

5G通信与蜂窝模组之间的关系

5G通信是第五代移动通信技术的简称,它代表了一种新一代的无线通信技术标准。5G通信的主要目标是提供更高的数据传输速度、更低的延迟、更大的网络容量以及更可靠的连接,以支持各种新兴应用和服务,包括高清视频流、虚拟现实、物联网(IoT)、自动驾驶汽车和远程医疗等。蜂窝模组在5G通信中代表了一种设备或组件,它用于使物联网(Io

SpringBoot集成Prometheus实现监控

SpringBoot配置Prometheuspom.xml引入监控以及prometheus依赖<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId></dependency><

软件设计师笔记系列(三)

😀前言随着计算机技术的日益发展,操作系统作为计算机系统的核心组件,其重要性不言而喻。操作系统不仅管理和控制计算机硬件和软件资源,还为用户和其他软件提供服务,使得复杂的计算机系统能够高效、安全和方便地运行。本章将深入探讨操作系统的一些基本概念,如程序与进程、进程的三态模型、死锁及其处理策略,以及磁盘调度算法。通过对这些

【C# Programming】值类型、良构类型

值类型1、值类型值类型的变量直接包含值。换言之,变量引用的位置就是值内存中实际存储的位置。2、引用类型引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。复制引用类型的值时,复制的只是引用。这个引用非常小(32位机器时4字节引用)3、结构除string和object是引用类型,所有C#内建类型都是值类型。C#

【Kafka系列】(二)Kafka的基本使用

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top首发博客地址[1]文章更新计划[2]系列文章地址[3]Kafka线上集群部署方案怎么做操作系统先说结论,Kafka部署在Linux上要比Windows和Mac上性能高的多,主要是以下几个原因:操作系

单臂路由的配置

目录单臂路由单臂路由是什么为什么要用单臂路由单臂路由的注意事项单臂路由的原理单臂路由的优缺点单臂路由的实验enspCiscoH3C单臂路由是什么单臂路由是一种特殊的路由器,它的设计目的是实现在一个路由器的一个接口上通过配置子接口(或“逻辑接口”,并不存在真正物理接口)的方式,实现原来相互隔离的不同VLAN(虚拟局域网)

热文推荐