学习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日

相关文章

  • 基于Swoole实现PHP与websocket聊天室

    下面是“基于Swoole实现PHP与websocket聊天室”的完整攻略。 什么是Swoole Swoole是一个可以实现异步、高并发、高性能网络通信和异步IO的PHP扩展,可用于创建Web服务器、WebSocket服务器、TCP/UDP服务器等应用。使用Swoole可以实现PHP应用的高并发和高性能,特别是在处理大量的IO事件的时候,具有出色的性能表现和高…

    PHP 2023年5月27日
    00
  • php中各种定义变量的方法小结

    下面是针对“php中各种定义变量的方法小结”的详细攻略: 一、变量的定义 在PHP中,可以通过以下几种方式来定义一个变量: 1. 使用“$”符号 定义变量最简单的方法就是在变量名前面加上$符号,例如: $name = ‘John’; 这样就定义了一个名为$name的变量,其值为字符串’John’。 2. 使用“declare”函数 declare函数是PHP…

    PHP 2023年5月25日
    00
  • PHP中的替代语法简介

    关于“PHP中的替代语法简介”的详细讲解,可以分为以下几个方面来讲解。 什么是PHP中的替代语法 在PHP中,可以使用替代语法来简化代码的书写。替代语法和常规语法本质上是相同的,只是在某些方面写法略有不同。常规语法中的大括号({ })用于标记代码块的开始和结束,而替代语法使用冒号(:)和关键字endif、endwhile和endforeach等来标记代码块的…

    PHP 2023年5月23日
    00
  • Win2003服务器高安全配置(冰盾防火墙设置方法)

    Win2003服务器高安全配置(冰盾防火墙设置方法) 什么是“冰盾防火墙” “冰盾防火墙”是一款基于Windows操作系统的防火墙软件,具有易用性和强大的功能特点,主要用于保护服务器和PC机的安全。 冰盾防火墙设置方法 以下是Win2003服务器上使用冰盾防火墙进行高安全配置的具体步骤: 步骤一:下载和安装冰盾防火墙软件 打开“http://www.icef…

    PHP 2023年5月27日
    00
  • php字符串中转义成特殊字符实例讲解

    下面详细讲解“php字符串中转义成特殊字符实例讲解”的完整攻略,过程中会包含两条示例说明。 标准转义字符 在php的字符串中,通过反斜线(\)可以将特殊字符进行转义。以下为一些常用的转义字符: 转义字符 含义 \\ 反斜线 \’ 单引号 \” 双引号 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \f 换页符 \xhh 以十六进制表示的 ASC…

    PHP 2023年5月26日
    00
  • php str_getcsv把字符串解析为数组的实现方法

    PHP str_getcsv把字符串解析为数组的实现方法 在开发过程中,经常需要处理csv格式的数据,而php中可以通过str_getcsv函数来将csv格式的字符串解析成数组,本文将详细介绍str_getcsv函数的实现方法。 函数定义与参数 str_getcsv函数用于将csv格式的字符串转化为数组,其定义如下: array str_getcsv ( s…

    PHP 2023年5月26日
    00
  • 用PHP与XML联手进行网站编程代码实例

    下面我将详细讲解使用PHP与XML联合编程的攻略。 前言 在网站编程中,我们常常需要使用到一些数据存储和数据交换的功能,而XML是存储和交换数据的一种常见格式。PHP可以很方便地读取和处理XML文件,因此PHP与XML联合编程是网站开发中非常常见的情况。 步骤 第一步:创建XML文件 我们可以使用任何一个文本编辑器来创建XML文件,下面是一个简单的例子: &…

    PHP 2023年5月23日
    00
  • PHP实现Socket服务器的代码

    下面是PHP实现Socket服务器代码的完整攻略: 知识储备 在阅读本攻略之前,您需要掌握以下几个知识点: Socket编程相关知识; PHP编程基础; Linux命令行基础。 实现过程 1. 创建Socket连接 PHP可以通过socket_create()函数创建Socket连接。在创建时需要指定Socket类型、传输协议、地址族等参数,常见的参数组合包…

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