PHP設計模式 - 享元模式
阿新 • • 發佈:2018-06-26
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設計模式 - 享元模式