PHP设计模式—享元模式

定义:

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

结构:

  • Flyweight:享元抽象类,所有具体享元类的接口,通过这个接口,Flyweight 可以接受并作用于外部状态。
  • ConcreteFlyweight:实现 Flyweight 接口的可以共享的具体享元类。
  • UnsharedConcreteFlyweight:非共享的具体享元类。
  • FlyweightFactory:享元工厂,用来创建并管理 Flyweight 对象,它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例或者创建一个(如果不存在的话)。
  • Client:客户端代码。

代码实例:

/**
 * 抽象类
 * Class Flyweight
 */
abstract class Flyweight
{
    protected $name;

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

    abstract public function show($content);
}

/**
 * 共享的具体类
 * Class ConcreteFlyweight
 */
class ConcreteFlyweight extends Flyweight
{

    /**
     * @param $content
     */
    public function show($content)
    {
        // TODO: Implement show() method.

        echo "共享的享元:{$this->name} {$content} ";
    }

}

/**
 * 不共享的具体类
 * Class UnsharedConcreteFlyweight
 */
class UnsharedConcreteFlyweight extends Flyweight
{

    /**
     * @param $content
     */
    public function show($content)
    {
        // TODO: Implement show() method.

        echo "不共享的享元:{$this->name} {$content} ";
    }

}

/**
 * 享元工厂
 * Class FlyweightFactory
 */
class FlyweightFactory
{

    /**
     * @var array
     */
    private $flyweights = [];

    /**
     * @param $name
     * @return mixed
     */
    public function getFlyweight($name)
    {
        if (!isset($this->flyweights[$name])) {
            $this->flyweights[$name] = new ConcreteFlyweight($name);
        }
        return $this->flyweights[$name];
    }

}

##客户端代码
// 创建享元工厂
$flyweightFactory = new FlyweightFactory();

// 共享的享元
$flyweight = $flyweightFactory->getFlyweight('state A');
$flyweight->show('other state A');
$flyweight = $flyweightFactory->getFlyweight('state B');
$flyweight->show('other state B');

// 不共享的对象,单独调用
$uflyweight = new UnsharedConcreteFlyweight('state A');
$uflyweight->show('state A');

##测试结果
共享的享元:state A other state A
共享的享元:state B other state B
不共享的享元:state A state A

总结:

  • 享元模式的目的是为了减少实例化大量的类时对内存的占用。
  • 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

Original: https://www.cnblogs.com/woods1815/p/16183117.html
Author: 幽篁晓筑
Title: PHP设计模式—享元模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612072/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 详解如何用 CSS3 完成 3D transform变换

    Tips:阅读提示!!! 首先,本文针对的是3D transform变换的学习,所以你需要对2D transform变换 有一定的了解 其次,需要说明的是,代码是一种需要自己不断实…

    数据库 2023年6月11日
    0110
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年5月24日
    067
  • CSS进阶内容—浮动和定位详解

    CSS进阶内容—浮动和定位详解 我们在学习了CSS的基本知识和盒子之后,就该了解一下网页的整体构成了 当然如果没有学习之前的知识,可以到我的主页中查看之前的文章: CSS的三种布局…

    数据库 2023年6月14日
    069
  • 计算机中内存、cache和寄存器之间的关系及区别

    寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。…

    数据库 2023年6月11日
    096
  • Centos7 离线安装K3s

    1、安装前准备 github地址:https://github.com/k3s-io/k3s/releases k3s二进制文件:k3s下载地址:github地址 / 百度网盘地址…

    数据库 2023年6月14日
    0100
  • 设计模式之(7)——装饰设计模式

    定义:装饰设计模式允许向一个现有的对象添加功能,而不改变其结构(这就很符合程序设计的” 开闭原则“),重点突出类功能的增强,属于结构型创建模式,这种模式创建…

    数据库 2023年6月14日
    062
  • 你知道5分钟法则和10字节法则么?

    如果一条数据每5分钟被访问一次,那么它应该常驻在内存中。类似的,如果想存储只有0和1两个值的标志位,相比于将8个标志位打包为1个字节,将1个标志位单独存储为1个字节是更节约的选择。…

    数据库 2023年6月14日
    098
  • null调整为not null default xxx,不得不注意的坑

    最近碰到一个case,值得分享一下。 现象 一个DDL,将列的属性从null调整为not null default xxx, alter table slowtech.t1 mod…

    数据库 2023年6月11日
    0101
  • 电商项目:玩转拼团活动营销设置

    拼团是什么意思?拼团是各大购物平台近两年新增的一种营销活动工具,买家通过自身分享邀请好友组团,成团后享受卖家商品的让利,商家不用过多宣传就能很好地解决产品推广和引流问题。 拼团的发…

    数据库 2023年6月14日
    063
  • MIT 6.824 Lab2A Raft之领导者选举

    实验准备 实验代码: git://g.csail.mit.edu/6.824-golabs-2021/src/raft 如何测试: go test -run 2A -race 相关…

    数据库 2023年6月14日
    092
  • Linux 学习笔记2(未完待续)

    Linux 学习笔记2 学习Linux的原因 Linux刚面世时并没有图形界面,所有操作全靠命令完成,如磁盘操作、文件读写、目录操作、进程管理、文件权限; 在职场中,大量的服务器维…

    数据库 2023年6月14日
    070
  • C++学习笔记(5)–STL

    void test03() { for (size_t i = 0; i < 100; ++i, cout << i << " "…

    数据库 2023年6月14日
    091
  • Golang异常处理

    从error的定义说起 type error interface { Error() string } Go 的error类型是一个接口。在Go中,只要实现了接口约定的方法,就等同…

    数据库 2023年6月16日
    076
  • MySQL日志

    一、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时…

    数据库 2023年5月24日
    093
  • CSS样式

    css概述 层叠样式表(cascading style sheet) 层叠是指==将多个样式施加在一个元素(标签)上== 作用: 美化页面 将html代码与样式代码分离 好处: 功…

    数据库 2023年6月16日
    084
  • 有趣的BUG之Stack Overflow

    今天遇到一个很有意思的bug,当程序开发完成后打包到服务器运行,总是会出现栈溢出异常,经过排查发现,问题出现在一个接口上,但这个接口逻辑并不复杂,除了几局逻辑代码外和打印语句之外也…

    数据库 2023年6月6日
    073
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球