1. 程式人生 > >PHP設計模式 - 享元模式

PHP設計模式 - 享元模式

turn 客戶 有效 nds 一個 true urn cli crete

運用共享技術有效的支持大量細粒度的對象

享元模式變化的是對象的存儲開銷

享元模式中主要角色:

抽象享元(Flyweight)角色:此角色是所有的具體享元類的超類,為這些類規定出需要實現的公共接口。那些需要外運狀態的操作可以通過調用商業以參數形式傳入

具體享元(ConcreteFlyweight)角色:實現Flyweight接口,並為內部狀態(如果有的話)拉回存儲空間。ConcreteFlyweight對象必須是可共享的。它所存儲的狀態必須是內部的

不共享的具體享元(UnsharedConcreteFlyweight)角色:並非所有的Flyweight子類都需要被共享。Flyweigth使共享成為可能,但它並不強制共享

享元工廠(FlyweightFactory)角色:負責創建和管理享元角色。本角色必須保證享元對象可能被系統適當地共享

客戶端(Client)角色:本角色需要維護一個對所有享元對象的引用。本角色需要自行存儲所有享元對象的外部狀態

享元模式的優點:

Flyweight模式可以大幅度地降低內存中對象的數量

享元模式的缺點:

Flyweight模式使得系統更加復雜

Flyweight模式將享元對象的狀態外部化,而讀取外部狀態使得運行時間稍微變長

享元模式適用場景:

當一下情況成立時使用Flyweight模式:

1 一個應用程序使用了大量的對象

2 完全由於使用大量的對象,造成很大的存儲開銷

3 對象的大多數狀態都可變為外部狀態

4 如果刪除對象的外部狀態,那麽可以用相對較少的共享對象取代很多組對象

5 應用程序不依賴於對象標識

<?php
abstract class Resources{
    public $resource=null;

    abstract public function operate();
}

class unShareFlyWeight extends Resources{
    public function __construct($resource_str) {
        $this->resource = $resource_str;
    }

    public function operate(){
        echo $this->resource."<br>";
    }
}

class shareFlyWeight extends Resources{
    private $resources = array();

    public function get_resource($resource_str){
        if(isset($this->resources[$resource_str])) {
            return $this->resources[$resource_str];
        }else {
            return $this->resources[$resource_str] = $resource_str;
        }
    }

    public function operate(){
        foreach ($this->resources as $key => $resources) {
            echo $key.":".$resources."<br>";
        }
    }
}


// client
$flyweight = new shareFlyWeight();
$flyweight->get_resource(‘a‘);
$flyweight->operate();


$flyweight->get_resource(‘b‘);
$flyweight->operate();

$flyweight->get_resource(‘c‘);
$flyweight->operate();

// 不共享的對象,單獨調用
$uflyweight = new unShareFlyWeight(‘A‘);
$uflyweight->operate();

$uflyweight = new unShareFlyWeight(‘B‘);
$uflyweight->operate();
/* 輸出:
 a:a
 a:a
 b:b
 a:a
 b:b
 c:c
 A
 B */

PHP設計模式 - 享元模式