定義:
享元模式(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
總結:
- 享元模式的目的是為了減少實體化大量的類時對記憶體的占用,
- 如果一個應用程式使用了大量的物件,而大量的這些物件造成了很大的存盤開銷時就應該考慮使用;還有就是物件的大多數狀態可以外部狀態,如果洗掉物件的外部狀態,那么可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/462955.html
標籤:其他
下一篇:行為型:八. 中介者模式
