PHP设计模式—享元模式

定义:

享元模式(Flyweight):运用共享技术有效地支持大量细粒度的对象。

结构:

  • Flyweight:享元抽象类,所有具体享元类的接口,通过这个接口,Flyweight 可以接受并作用于外部状态。
  • ConcreteFlyweight:实现 Flyweight 接口的可以共享的具体享元类。
  • UnsharedConcreteFlyweight:非共享的具体享元类。
  • FlyweightFactory:享元工厂,用来创建并管理 Flyweight 对象,它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例或者创建一个(如果不存在的话)。
  • Client:客户端代码。

代码实例:

/**
 * 抽象类
 * Class Flyweight
 */
abstract class Flyweight
{
    protected $name;

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


    abstract public function show($content);
}


/**
 * 共享的具体类
 * Class ConcreteFlyweight
 */
class ConcreteFlyweight extends Flyweight
{

    /**
     * @param $content
     */
    public function show($content)
    {
        // TODO: Implement show() method.
        echo "共享的享元:{$this->name} {$content} <br>";
    }

}


/**
 * 不共享的具体类
 * Class UnsharedConcreteFlyweight
 */
class UnsharedConcreteFlyweight extends Flyweight
{

    /**
     * @param $content
     */
    public function show($content)
    {
        // TODO: Implement show() method.
        echo "不共享的享元:{$this->name} {$content} <br>";
    }

}


/**
 * 享元工厂
 * Class FlyweightFactory
 */
class FlyweightFactory
{

    /**
     * @var array
     */
    private $flyweights = [];


    /**
     * @param $name
     * @return mixed
     */
    public function getFlyweight($name)
    {
        if (!isset($this->flyweights[$name])) {
            $this->flyweights[$name] = new ConcreteFlyweight($name);
        }
        return $this->flyweights[$name];
    }

}


##客户端代码
// 创建享元工厂
$flyweightFactory = new FlyweightFactory();

// 共享的享元
$flyweight = $flyweightFactory->getFlyweight('state A');
$flyweight->show('other state A');
$flyweight = $flyweightFactory->getFlyweight('state B');
$flyweight->show('other state B');

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


##测试结果
共享的享元:state A other state A
共享的享元:state B other state B
不共享的享元:state A state A

总结:

  • 享元模式的目的是为了减少实例化大量的类时对内存的占用。
  • 如果一个应用程序使用了大量的对象,而大量的这些对象造成了很大的存储开销时就应该考虑使用;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值