学习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动态生成javascript文件的2个例子

    让我为您详细讲解一下”PHP动态生成javascript文件的2个例子”的攻略。 首先,我们需要明确一下JavaScript是一种在客户端执行的脚本语言,而PHP是一种在服务器端执行的脚本语言。动态生成JavaScript文件,指的是在服务器端生成相应的JavaScript代码,然后让客户端去加载这些代码,这样可以减轻客户端的负担,提升网站的性能。 例子1:…

    PHP 2023年5月26日
    00
  • 详解jQuery uploadify文件上传插件的使用方法

    详解jQuery uploadify文件上传插件的使用方法 概述 jQuery uploadify是一个轻量级的文件上传插件,基于jQuery框架实现。它支持多文件上传、进度条显示、拖拽上传等功能,在前端实现文件上传功能非常方便。 安装 从jQuery uploadify官网(https://www.uploadify.com/)下载最新版本的插件,将其解压…

    PHP 2023年5月27日
    00
  • PHP 翻页 实例代码

    接下来我将为您详细讲解关于“PHP 翻页 实例代码”的完整攻略。 什么是翻页? 翻页(Paging或Pagination)是指在页面上分多个条目或栏目显示信息,需要在用户界面上实现将这些条目或栏目分批次或一页一页显示的功能。对于常见的网页来说,翻页是一种方便用户查看大量数据的方式,是一个基本而又普遍的需求。 翻页实现的主要难点 PHP实现翻页主要的难点在于计…

    PHP 2023年5月24日
    00
  • PHP学习一(基础)第1/2页

    为了学习PHP,您可以按照以下步骤进行操作: 1.安装PHP和Web服务器 要开始学习PHP,您需要一个PHP解释器和一个Web服务器。 安装PHP 您可以从PHP官方网站下载最新版的PHP: https://www.php.net/downloads.php ,按照提示完成安装即可。 安装Web服务器 Web服务器是用于在浏览器中运行PHP脚本的。常见的W…

    PHP 2023年5月23日
    00
  • 分析JS单线程异步io回调的特性

    分析 JS 单线程异步 IO 回调的特性可以从以下几个方面进行: 单线程 JavaScript 是一门单线程语言,它从设计之初就决定了在同一时刻只能执行一个程序代码块。这意味着当代码被执行的时候,只有一个调用栈。当一段程序被执行的时候,它会依次进入调用栈中。当某个函数被执行时,它也会进入调用栈中。当该函数执行结束时,它会从调用栈中弹出。这样在业务逻辑上就很难…

    PHP 2023年5月27日
    00
  • C#读取文件MD5值的实现代码

    下面是C#读取文件MD5值的实现代码的完整攻略。 一、什么是MD5 MD5全称是Message-Digest Algorithm 5(信息摘要算法5),是一种单向加密算法。在数据传输和处理中常用于校验数据的完整性和一致性。 二、如何使用C#读取文件的MD5值 使用C#读取文件的MD5值需要使用System.Security.Cryptography命名空间中…

    PHP 2023年5月23日
    00
  • php实现HTML实体编号与非ASCII字符串相互转换类实例

    讲解“php实现HTML实体编号与非ASCII字符串相互转换类实例”的完整攻略。 什么是HTML实体编号? HTML实体编号是将HTML中的特殊字符转换成实体名称或数字的过程。在HTML中,一些字符有特殊的含义,这些特殊字符包括小于号、大于号、引号等。当在HTML中使用这些字符时,需要将它们用实体名称或数字表示,这样浏览器才能正确地显示它们。 为什么需要实现…

    PHP 2023年5月23日
    00
  • php提供实现反射的方法和实例代码

    下面是详细的攻略: 概述 反射(Reflection)是PHP中非常重要的一个功能,它可以让我们对代码进行更深入的探索,包括获取类的详细信息、查看函数的参数列表、修改代码等。PHP提供了一系列函数和类,用于实现反射,本文将介绍PHP提供反射功能的方法和实例代码。 实现反射的方法 PHP提供了两个类来实现反射功能:Reflection类和ReflectionC…

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