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

yizhihongxing

学习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 验证码实例代码

    当开发一些需要用户输入敏感信息的网站时,很有必要在用户提交表单前进行验证码验证,以防止恶意用户通过程序提交大量无效数据。在 PHP 中,我们可以使用一些库或者自己编写代码来生成并验证验证码。 下面我会讲解一些生成验证码的常用方法,以及提供一些生成验证码的示例代码。 生成图形验证码 步骤1:定义一个字符集 我们要生成随机的字符验证码,需要定义一个字符集,可以是…

    PHP 2023年5月23日
    00
  • php strlen mb_strlen计算中英文混排字符串长度

    当需要计算字符串的长度时,我们可以使用PHP内置的 strlen() 函数。但是注意,strlen() 函数只能正确计算纯英文字符串的长度,对于中英文混排字符串的计算可能不准确,因为PHP默认的字符编码是ASCII,而中文字符占用的字节数是两个,这就导致使用 strlen() 函数计算中英文混排字符串长度是不正确的。 在这种情况下,我们可以使用 mb_str…

    PHP 2023年5月26日
    00
  • PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式

    首先需要了解一下正则表达式的基本语法。在正则表达式中,空格可以用”\s”表示、换行符可以用”\n”表示、中文逗号可以用”,”表示、英文逗号可以用”,”表示。 要想把空格、换行符、中文逗号等替换成英文逗号,可以使用PHP中的正则表达式函数preg_replace。这个函数可以用来替换字符串的某些部分。具体的语法如下: preg_replace ( mixed …

    PHP 2023年5月26日
    00
  • PHP Array 数组详细介绍

    PHP Array 数组详细介绍 在PHP中,数组是一种特殊的数据结构,它可以存储多个值,并且可以通过索引或关联键来访问这些值。PHP中的数组可以用于许多不同的用途,包括将多个变量组合成一个数组、存储和操作数据,以及在网站开发中缓存数据等等。 数组定义 在PHP中,可以通过两种方式定义数组:索引数组和关联数组。 索引数组 索引数组在定义时使用整数作为键名。下…

    PHP 2023年5月26日
    00
  • 深入解析php中的foreach问题

    当我们在使用 PHP 进行编程时,可能会遇到 foreach 循环的一些奇怪功能和问题。在本文中,我们将探讨使用 foreach 循环的 PHP 开发中最常见的问题,并提供一些解决这些问题的解决方案。 问题 1:如何避免修改 foreach 循环中的数组 通常,我们在 PHP 开发中使用 foreach 循环来遍历数组。但是,有时我们需要对循环的数组进行一些…

    PHP 2023年5月27日
    00
  • 是 WordPress 让 PHP 更流行了 而不是框架

    首先要了解的是,WordPress是基于PHP语言开发的开源CMS(内容管理系统)软件。PHP是一种流行的服务器端编程语言之一,其相对容易学习和使用的特性也是让其流行的原因之一。因此,许多开发人员选择基于PHP框架进行开发,如Laravel、Symfony、CodeIgniter等,这些框架帮助开发者通过提供许多常见的解决方案和工具,加快了项目的开发速度和质…

    PHP 2023年5月23日
    00
  • PHP循环与分支知识点梳理

    以下是“PHP循环与分支知识点梳理”的完整使用攻略,包括循环和分支的基本概念、常见语句和示例说明等内容。 循和分支基本概念 循环和支是编程中常用的两种控制结构,它们可以帮助程序实现复杂的逻辑和流程控制。在PHP中循环和分支语句可以帮助程序实现重复执行和条件判断等功能。 常见语句 以下是循环和分支的常见语句: 1. 循环语句 for循环 for循环是一种常见的…

    PHP 2023年5月12日
    00
  • php中二分法查找算法实例分析

    下面是详细讲解“php中二分法查找算法实例分析”的完整攻略。 1. 什么是二分法查找算法? 二分法查找算法,也称为折半搜索算法、二分搜索算法、对数搜索算法,用于在一定范围内查找特定的元素,其核心思想是将待查找范围不断缩小为原来的一半。这个算法的执行效率很高,可以在大数据集中迅速查找到所需的元素。 2. 实现步骤 下面是该算法的具体实现步骤: 1.确定初始查找…

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