PHP设计模式系列(二十一):享元模式

享元模式是一种对象结构型模式,通过共享技术提高相似细粒度对象的复用效率。该模式包括抽象享元类、具体享元类、非共享具体享元类和享元工厂类。本文将介绍享元模式的结构,并提供PHP代码实现及运行结果展示。
摘要由CSDN通过智能技术生成

享元模式

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,它是一种对象结构型模式。

模式结构

享元模式包含如下角色:

  • Flyweight: 抽象享元类
  • ConcreteFlyweight: 具体享元类
  • UnsharedConcreteFlyweight: 非共享具体享元类
  • FlyweightFactory: 享元工厂类

结构图

这里写图片描述

PHP代码实现

<?php
/**
 * 享元模式
 */
abstract class Flyweight {
    abstract public function operation($state);
}

//具体享元角色
class ConcreteFlyweight extends Flyweight {
    private $state = null;
    public function __construct($state) {
        $this->state = $state;
    }
    public function operation($state) {
        var_dump('具体Flyweight:'.$state);
    }

}

//不共享的具体享元,客户端直接调用
class UnsharedConcreteFlyweight extends Flyweight {
    private $state = null;
    public function __construct($state) {
        $this->state = $state;
    }
    public function operation($state) {
        var_dump('不共享的具体Flyweight:'.$state);
    }
}

//享元工厂角色
class FlyweightFactory {
    private $flyweights;
    public function __construct() {
        $this->flyweights = array();
    }
    public function getFlyweigth($state) {
        if (isset($this->flyweights[$state])) {
            return $this->flyweights[$state];
        } else {
            return $this->flyweights[$state] = new ConcreteFlyweight($state);
        }
    }
}

$f = new FlyweightFactory();
$a = $f->getFlyweigth('state A');
$a->operation("other state A");

$b = $f->getFlyweigth('state B');
$b->operation('other state B');

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

运行结果

string '具体Flyweight:other state A' (length=29)
string '具体Flyweight:other state B' (length=29)
string '不共享的具体Flyweight:other state A' (length=41)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值