学习php设计模式 php实现享元模式(flyweight)

学习PHP设计模式之PHP实现享元模式(Flyweight)

什么是享元模式

享元模式属于结构型模式,通过以共享的方式高效地支持大量细粒度对象的重用。在享元模式中,将对象分为两类:共享对象和非共享对象。共享对象旨在尽可能减少对象的数量,从而减少内存使用和提高性能。

为什么使用享元模式

在应用程序中,通常会创建大量的对象,这些对象可能具有相同或相似的属性,使用传统的对象创建方式,会使得内存中对象的数量不断增加,导致性能下降,甚至可能会导致程序崩溃,而采用享元模式能够有效地降低系统内存的占用率,提高程序运行效率。

实现享元模式

实现享元模式,需要重点关注如何管理和共享对象,具体如下:

  1. 创建享元工厂类:用于管理共享对象,通常是一个单例模式,能够在需要时创建或返回共享对象。

  2. 创建享元类:包括共享对象和非共享对象两部分,共享对象通常只包含属性,而非共享对象除了属性,还包括方法等。

  3. 创建客户端类:根据需要获取享元对象,并调用其方法。

下面是PHP代码实现。

享元类

class Flyweight {
    private $sharedData;

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

    public function operation($unsharedData) {
        echo '共享的数据:' . $this->sharedData . ' 非共享的数据:' . $unsharedData . '<br/>';
    }
}

享元工厂类

class FlyweightFactory {
    private $flyweights = [];

    public function getFlyweight($sharedData) {
        if (!isset($this->flyweights[$sharedData])) {
            $this->flyweights[$sharedData] = new Flyweight($sharedData);
        }
        return $this->flyweights[$sharedData];
    }
}

客户端类

$factory = new FlyweightFactory();
$flyweight = $factory->getFlyweight('data1');
$flyweight->operation('data2');

$flyweight = $factory->getFlyweight('data1');
$flyweight->operation('data3');

上面的示例中,创建了享元类Flyweight,其中包含了共享属性sharedData和非共享属性unsharedData,创建了享元工厂类FlyweightFactory,用于管理共享对象。客户端通过调用getFlyweight方法获取享元对象,并调用其operation方法。

示例说明

示例1:数值转换

class Number {
    private $number;

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

    public function toBinary() {
        return decbin($this->number);
    }

    public function toOctal() {
        return decoct($this->number);
    }

    public function toHex() {
        return dechex($this->number);
    }
}

class NumberFactory {
    private $numbers = [];

    public function getNumber($number) {
        if (!isset($this->numbers[$number])) {
            $this->numbers[$number] = new Number($number);
        }
        return $this->numbers[$number];
    }
}

$factory = new NumberFactory();
$number1 = $factory->getNumber(10);
$number2 = $factory->getNumber(10);
$number3 = $factory->getNumber(16);
$number4 = $factory->getNumber(16);

echo $number1->toBinary() . '<br/>'; // 1010
echo $number2->toOctal() . '<br/>'; // 12
echo $number3->toHex() . '<br/>';   // a
echo $number4->toOctal() . '<br/>'; // 20

在上面的示例中,创建了Number类,其中包含了将数值转换为二进制、八进制和十六进制的方法,创建了NumberFactory工厂类,用于管理共享对象。客户端通过调用getNumber方法获取享元对象,并调用其toBinary、toOctal和toHex方法。

由于10和16被共享了,所以number1和number2是同一个对象,number3和number4是同一个对象。

示例2:文字编码

class Character {
    private $char;
    private $font;

    public function __construct($char, $font) {
        $this->char = $char;
        $this->font = $font;
    }

    public function display() {
        echo $this->char . ' (' . $this->font . ')<br/>';
    }
}

class CharacterFactory {
    private $characters = [];

    public function getCharacter($char, $font) {
        if (!isset($this->characters[$char . $font])) {
            $this->characters[$char . $font] = new Character($char, $font);
        }
        return $this->characters[$char . $font];
    }
}

$factory = new CharacterFactory();
$char1 = $factory->getCharacter('a', 'Arial');
$char2 = $factory->getCharacter('a', 'Times New Roman');
$char3 = $factory->getCharacter('b', 'Arial');
$char4 = $factory->getCharacter('a', 'Arial');

$char1->display(); // a (Arial)
$char2->display(); // a (Times New Roman)
$char3->display(); // b (Arial)
$char4->display(); // a (Arial)

在上面的示例中,创建了Character类,其中包含了字母和字体两个属性,以及用于显示字符的方法。创建了CharacterFactory工厂类,用于管理共享对象。客户端通过调用getCharacter方法获取享元对象,并调用其display方法。

由于'a'和Arial被共享了,所以char1和char4是同一个对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习php设计模式 php实现享元模式(flyweight) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 聊一聊关于php源码中refcount的疑问

    以下是关于“聊一聊关于PHP源码中refcount的疑问”的完整使用攻略: 基础知识 在了解PHP源码中的refcount之前,需要掌握一些基础知识,包括PHP变量的内部结构、PHP变量的引用计数机制、PHP变量的垃圾回收机制等。以下是一些常见的基础知识: PHP变量的内部结构,包括zval结构体、zend_string结构体等。 PHP变量的引用计数机制,…

    PHP 2023年5月12日
    00
  • php利用curl抓取新浪微博内容示例

    下面是详细讲解“php利用curl抓取新浪微博内容示例”的完整攻略: 1. 确认需求和环境 首先,我们需要确认自己的开发环境是否满足要求,包括 PHP 的版本和必要的扩展库是否安装。接着,我们需要了解需要抓取的微博内容的 URL 格式以及可能需要的参数和请求头信息。 2. 使用curl库发送HTTP请求 我们使用 PHP 中的 curl 库来模拟 HTTP …

    PHP 2023年5月27日
    00
  • array_values()在php中返回数组的操作实例

    下面是关于array_values()在PHP中返回数组的操作实例的完整攻略: 1. array_values()函数的定义 array_values()函数是一个PHP内置函数,它的作用是返回一个数组的所有值(或值的副本),并以数字索引重新排列数组。 函数的语法为: array_values(array $array): array 其中,array参数是…

    PHP 2023年5月26日
    00
  • PHP实现PDF转图片的详细过程(使用imagick)

    下面是“PHP实现PDF转图片的详细过程(使用imagick)”的完整使用攻略,包括问题原因、解决方法和两个示例。 问题原因 在Web开发,有时需要将PDF文件转换为图片以便在网页上显示。但是,PHP本身不支持PDF文件的处理,因此需要使用三方库来实现PDF转图片的。 解决方法 以下是使用imagick库实现PDF转图片的方法: 安装imagick库 在使用…

    PHP 2023年5月12日
    00
  • 详解php微信小程序消息推送配置

    详解PHP微信小程序消息推送配置 什么是微信小程序消息推送? 微信小程序消息推送是指向用户发送微信推送服务所提供的通知。你可以通过向微信服务器发送推送消息,通知订阅用户相关的信息。 准备工作 在推送消息之前,你需要先完成以下准备: 确保已使用微信开放平台账号登录小程序的后台管理界面 在小程序后台开通了“服务号”或“订阅号”的功能 已经拥有了自己的微信公众号开…

    PHP 2023年5月23日
    00
  • 让的PHP代码飞起来的40条小技巧(提升php效率)

    下面我将详细介绍 “让的PHP代码飞起来的40条小技巧(提升php效率)” 的攻略。 1. 使用最新版本的 PHP 使用最新版本的 PHP 可以提升代码效率,因为新版本通常性能更好,而且包含更多优化和新特性。 2. 优化代码结构 合理的代码结构可以使得代码更加易读、易维护。常见的优化方法包括合理的命名、避免重复代码等。 3. 避免重复的代码 重复的代码往往会…

    PHP 2023年5月23日
    00
  • W3C是什么意思 W3C标准简介

    W3C是什么意思? W3C是World Wide Web Consortium的首字母缩写,中文名为“万维网联盟”。W3C是一个国际性的标准组织,负责制定Web标准,是Web技术的指导和推荐者。W3C由Web发明人Tim Berners-Lee于1994年创建,总部位于法国南部尼斯市,拥有来自全球各地的会员组织,包括公司、政府部门和领先的Web发展机构等。 …

    PHP 2023年5月27日
    00
  • 微信小程序存在漏洞吗 微信小程序会堵上那些app漏洞吗

    微信小程序存在漏洞吗 是的,微信小程序同样存在漏洞。随着微信小程序的普及和使用,黑客也开始尝试攻击微信小程序,以获取非法利益或窃取用户信息等。 微信小程序攻击包括以下漏洞类型: XSS(跨站脚本)漏洞:黑客可以通过注入恶意脚本,来窃取用户信息、欺骗用户等。 CSRF(跨站请求伪造)漏洞:黑客可以通过构造特制的链接或网页,来进行针对性攻击,如恶意转账、修改用户…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部