定義: 享元模式(Flyweight):運用共用技術有效地支持大量細粒度的對象。 結構: Flyweight:享元抽象類,所有具體享元類的介面,通過這個介面,Flyweight 可以接受並作用於外部狀態。 ConcreteFlyweight:實現 Flyweight 介面的可以共用的具體享元類。 U ...
定義:
享元模式(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
總結:
- 享元模式的目的是為了減少實例化大量的類時對記憶體的占用。
- 如果一個應用程式使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共用對象取代很多組對象,此時可以考慮使用享元模式。