最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

學習php設計模式 php實現(xiàn)享元模式(flyweight)

 更新時間:2015年12月07日 16:41:03   作者:胖胖  
這篇文章主要介紹了php設計模式中的享元模式,使用php實現(xiàn)享元模式,感興趣的小伙伴們可以參考一下

一、意圖
運用共享技術(shù)有效的支持大量細粒度的對象
享元模式變化的是對象的存儲開銷
二、享元模式結(jié)構(gòu)圖

三、享元模式中主要角色
抽象享元(Flyweight)角色:此角色是所有的具體享元類的超類,為這些類規(guī)定出需要實現(xiàn)的公共接口。那些需要外蘊狀態(tài)的操作可以通過調(diào)用商業(yè)以參數(shù)形式傳入
具體享元(ConcreteFlyweight)角色:實現(xiàn)Flyweight接口,并為內(nèi)部狀態(tài)(如果有的話)拉回存儲空間。ConcreteFlyweight對象必須是可共享的。它所存儲的狀態(tài)必須是內(nèi)部的
不共享的具體享元(UnsharedConcreteFlyweight)角色:并非所有的Flyweight子類都需要被共享。Flyweigth使共享成為可能,但它并不強制共享。
享元工廠(FlyweightFactory)角色:負責創(chuàng)建和管理享元角色。本角色必須保證享元對象可能被系統(tǒng)適當?shù)毓蚕?br /> 客戶端(Client)角色:本角色需要維護一個對所有享元對象的引用。本角色需要自行存儲所有享元對象的外部狀態(tài)
四、享元模式的優(yōu)點和缺點
享元模式的優(yōu)點:Flyweight模式可以大幅度地降低內(nèi)存中對象的數(shù)量。
享元模式的缺點:
1、Flyweight模式使得系統(tǒng)更加復雜
2、Flyweigth模式將享元對象的狀態(tài)外部化,而讀取外部狀態(tài)使得運行時間稍微變長
五、享元模式適用場景
當以下情況都成立時使用Flyweight模式:
1、一個應用程序使用了大量的對象
2、完全由于使用大量的對象,造成很大的存儲開銷
3、對象的大多數(shù)狀態(tài)都可變?yōu)橥獠繝顟B(tài)
4、如果刪除對象的外部狀態(tài),那么可以用相對較少的共享對象取代很多組對象
5、應用程序不依賴于對象標識。
六、享元模式與其它模式
單例模式(Singleton):客戶端要引用享元對象,是通過工廠對象創(chuàng)建或者獲得的,客戶端每次引用一個享元對象,都是可以通過同一個工廠對象來引用所需要的享元對象。因此,可以將享元工廠設計成單例模式,這樣就可以保證客戶端只引用一個工廠實例。因為所有的享元對象都是由一個工廠對象統(tǒng)一管理的,所以在客戶端沒有必要引用多個工廠對象。不管是單純享元模式還是復合享元模式中的享元工廠角色,都可以設計成為單例模式,對于結(jié)果是不會有任何影響的。
Composite模式:復合享元模式實際上是單純享元模式與合成模式的組合。單純享元對象可以作為樹葉對象來講,是可以共享的,而復合享元對象可以作為樹枝對象,因此在復合享元角色中可以添加聚集管理方法。
七、享元模式PHP示例

<?php
/**
 * 抽象享元角色
 */
abstract class Flyweight {
 
 /**
  * 示意性方法
  * @param string $state 外部狀態(tài)
  */
 abstract public function operation($state);
}
 
/**
 * 具體享元角色
 */
class ConcreteFlyweight extends Flyweight {
 
 private $_intrinsicState = null;
 
 /**
  * 構(gòu)造方法
  * @param string $state 內(nèi)部狀態(tài)
  */
 public function __construct($state) {
  $this->_intrinsicState = $state;
 }
 
 public function operation($state) {
  echo 'ConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState
  . ' Extrinsic State = ' . $state . '<br />';
 }
 
}
 
/**
 * 不共享的具體享元,客戶端直接調(diào)用
 */
class UnsharedConcreteFlyweight extends Flyweight {
 
 private $_intrinsicState = null;
 
 /**
  * 構(gòu)造方法
  * @param string $state 內(nèi)部狀態(tài)
  */
 public function __construct($state) {
  $this->_intrinsicState = $state;
 }
 
 public function operation($state) {
  echo 'UnsharedConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState
  . ' Extrinsic State = ' . $state . '<br />';
 }
 
}
 
/**
 * 享元工廠角色
 */
class FlyweightFactory {
 
 private $_flyweights;
 
 public function __construct() {
  $this->_flyweights = array();
 }
 
 public function getFlyweigth($state) {
  if (isset($this->_flyweights[$state])) {
   return $this->_flyweights[$state];
  } else {
   return $this->_flyweights[$state] = new ConcreteFlyweight($state);
  }
 }
 
}
 
/**
 * 客戶端
 */
class Client {
 
 /**
  * Main program.
  */
 public static function main() {
  $flyweightFactory = new FlyweightFactory();
  $flyweight = $flyweightFactory->getFlyweigth('state A');
  $flyweight->operation('other state A');
 
  $flyweight = $flyweightFactory->getFlyweigth('state B');
  $flyweight->operation('other state B');
 
  /* 不共享的對象,單獨調(diào)用 */
  $uflyweight = new UnsharedConcreteFlyweight('state A');
  $uflyweight->operation('other state A');
 }
 
}
 
Client::main();
?>

八、復合享元模式
復合享元模式對象是由一些單純享元使用合成模式加以復合而成
復合享元角色所代表的對象是不可以共享的,但是一個復合享元對象可以分解成為多個本身是單純享元對象的組合。
九、復合享元模式PHP示例

<?php
/**
 * 抽象享元角色
 */
abstract class Flyweight {
 
 /**
  * 示意性方法
  * @param string $state 外部狀態(tài)
  */
 abstract public function operation($state);
}
 
/**
 * 具體享元角色
 */
class ConcreteFlyweight extends Flyweight {
 
 private $_intrinsicState = null;
 
 /**
  * 構(gòu)造方法
  * @param string $state 內(nèi)部狀態(tài)
  */
 public function __construct($state) {
  $this->_intrinsicState = $state;
 }
 
 public function operation($state) {
  echo 'ConcreteFlyweight operation, Intrinsic State = ' . $this->_intrinsicState
  . ' Extrinsic State = ' . $state . '<br />';
 }
 
}
 
/**
 * 不共享的具體享元,客戶端直接調(diào)用
 */
class UnsharedConcreteFlyweight extends Flyweight {
 
 private $_flyweights;
 
 /**
  * 構(gòu)造方法
  * @param string $state 內(nèi)部狀態(tài)
  */
 public function __construct() {
  $this->_flyweights = array();
 }
 
 public function operation($state) {
  foreach ($this->_flyweights as $flyweight) {
   $flyweight->operation($state);
  }
 }
 
 public function add($state, Flyweight $flyweight) {
  $this->_flyweights[$state] = $flyweight;
 }
 
}
 
/**
 * 享元工廠角色
 */
class FlyweightFactory {
 
 private $_flyweights;
 
 public function __construct() {
  $this->_flyweights = array();
 }
 
 public function getFlyweigth($state) {
  if (is_array($state)) { // 復合模式
   $uFlyweight = new UnsharedConcreteFlyweight();
 
   foreach ($state as $row) {
    $uFlyweight->add($row, $this->getFlyweigth($row));
   }
   return $uFlyweight;
  } else if (is_string($state)) {
   if (isset($this->_flyweights[$state])) {
    return $this->_flyweights[$state];
   } else {
    return $this->_flyweights[$state] = new ConcreteFlyweight($state);
   }
  } else {
   return null;
  }
 }
 
}
 
/**
 * 客戶端
 */
class Client {
 
 /**
  * Main program.
  */
 public static function main() {
  $flyweightFactory = new FlyweightFactory();
  $flyweight = $flyweightFactory->getFlyweigth('state A');
  $flyweight->operation('other state A');
 
  $flyweight = $flyweightFactory->getFlyweigth('state B');
  $flyweight->operation('other state B');
 
  /* 復合對象*/
  $uflyweight = $flyweightFactory->getFlyweigth(array('state A', 'state B'));
  $uflyweight->operation('other state A');
 }
 
}
 
Client::main();
?>

十、PHP中享元模式的地位
相對于其它模式,F(xiàn)lyweight模式在PHP的現(xiàn)有版本中沒有太大的意義,因為PHP的生命周期是頁面級的,即從一個PHP文件執(zhí)行開始會載入所需的資源,當執(zhí)行完畢后,這些所有的資源會被全部釋放,而一般來說我們也不會讓一個頁面執(zhí)行太長時間。

以上就是使用php實現(xiàn)享元模式的代碼,還有一些關(guān)于享元模式的概念區(qū)分,希望對大家的學習有所幫助。

相關(guān)文章

最新評論

周至县| 那曲县| 无锡市| 定结县| 乐清市| 遂平县| 灵山县| 安陆市| 得荣县| 兴山县| 武宁县| 临安市| 乾安县| 枣强县| 华阴市| 兴仁县| 新蔡县| 彭泽县| 晋城| 玛沁县| 边坝县| 巴南区| 绍兴市| 河东区| 大渡口区| 古丈县| 辽宁省| 庆城县| 蒙阴县| 静海县| 安化县| 大宁县| 阳朔县| 黄骅市| 十堰市| 亚东县| 富裕县| 平乐县| 商南县| 霞浦县| 岑溪市|