<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## **享元模式的定義與特點** **享元(Flyweight)模式定義:**: * 運用共享技術來有效地支持大量細粒度對象的復用。它通過共享已經存在的又橡來大幅度減少需要創建的對象數量、避免大量相似類的開銷,從而提高系統資源的利用率。 >[danger] 面向對象技術可以很好地解決一些靈活性或可擴展性問題,但在很多情況下需要在系統中增加類和對象的個數。當對象數量太多時,將導致運行代價過高,帶來性能下降等問題。享元模式正是為解決這一類問題而誕生的。享元模式通過共享技術實現相同或相似對象的重用。 **主要優點:** * 相同對象只要保存一份,這降低了系統中對象的數量,從而降低了系統中細粒度對象給內存帶來的壓力。 **其主要缺點是:** * 為了使對象可以共享,需要將一些不能共享的狀態外部化,這將增加程序的復雜性。 * 讀取享元模式的外部狀態會使得運行時間稍微變長。 ## **享元模式適用場景:** 享元模式是通過減少內存中對象的數量來節省內存空間的,所以以下幾種情形適合采用享元模式。 * 一個應用程序使用了大量相同或相似的對象,這些對象耗費大量的內存資源,造成很大的存儲開銷 * 對象的大多數狀態都可變為外部狀態 * 如果刪除對象的外部狀態,那么可以用相對較少的共享對象取代很多組對象 * 應用程序不依賴于對象標識 * 大部分的對象可以按照內部狀態進行分組,且可將不同部分外部化,這樣每一個組只需保存一個內部狀態。 * 由于享元模式需要額外維護一個保存享元的[數據結構](http://c.biancheng.net/data_structure/),所以應當在有足夠多的享元實例時才值得使用享元模式。 ## **應用:** * String常量池 系統底層的設計。例如字符串的創建。如果兩個字符串相同,則不會創建第二個字符串,而是第二個的引用直接指向第一個字符串。$str1=”abc”,$str2=”abc”.則內存存儲中只會創建一個字符串“abc”而引用$str1.$str2都會指向它。 * 數據庫連接池 ## **模式的結構** 享元模式的主要角色有如下。 1. 抽象享元角色(Flyweight):是所有的具體享元類的基類,為具體享元規范需要實現的公共接口,非享元的外部狀態以參數的形式通過方法傳入。 2. 具體享元(Concrete Flyweight)角色:實現抽象享元角色中所規定的接口。 3. 非享元(Unsharable Flyweight)角色:是不可以共享的外部狀態,它以參數的形式注入具體享元的相關方法中。 4. 享元工廠(Flyweight Factory)角色:負責創建和管理享元角色。當客戶對象請求一個享元對象時,享元工廠檢査系統中是否存在符合要求的享元對象,如果存在則提供給客戶;如果不存在的話,則創建一個新的享元對象。 ![](https://img.kancloud.cn/82/a6/82a68517d472c96c69aa71e1c2e96cf0_767x532.png) ``` //不共享的具體享元角色,客戶端直接調用 class UnsharedConcreteFlyweight{ private $info; function __construct($info){ $this->info = $info; } function getInfo(){ return $this->info; } function setInfo($info){ $this->info=$info; } } //抽象享元角色 interface Flyweight{ function operation(UnsharedConcreteFlyweight $state); } //共享的具體享元角色1 class ConcreteFlyweight implements Flyweight{ private $key; function __construct(String $key){ $this->key = $key; echo "具體享元".$key."被創建!<br>"; } function operation(UnsharedConcreteFlyweight $outState){ echo "具體享元".$this->key."被調用!"; echo "非享元信息是:".$outState->getInfo()."<br>"; } } //享元工廠模式 class FlyweightFactory{ private $flyweights = array(); function getFlyweight($key){ if(!isset($this->flyweights[$key])){ $this->flyweights[$key]=new ConcreteFlyweight($key); } echo "具體享元".$state."已經存在,被成功獲取!<br>"; return $this->flyweights[$key]; } } //測試 $flyweightFactory = new FlyweightFactory(); $flyweight1 = $flyweightFactory->getFlyweight("state A"); $flyweight2 = $flyweightFactory->getFlyweight("state A"); $flyweight3 = $flyweightFactory->getFlyweight("state A"); $flyweight4 = $flyweightFactory->getFlyweight("state B"); $unflyweight = new UnsharedConcreteFlyweight("C"); //非共享可以使是其他任何類對象 $flyweight1->operation($unflyweight); $flyweight2->operation($unflyweight); $flyweight3->operation($unflyweight); $flyweight4->operation($unflyweight); ``` **例子2:** ``` //所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受并作用于外部狀態。 abstract class Flyweight { //內部狀態 string public $intrinsic; //外部狀態 String protected $extrinsic; //這里要求享元角色必須接受外部狀態 public function __construct($extrinsic) { $this->extrinsic = $extrinsic; } /** * 定義業務操作 * @param int $extrinsic 外部狀態 */ public abstract function operate($extrinsic); /** * * @return String 獲取外部狀態 */ public function getIntrinsic() { return intrinsic; } /** * * @param String $intrinsic 設置外部狀態 */ public function setIntrinsic($intrinsic) { $this->intrinsic = $intrinsic; } } //繼承Flyweight超類或實現Flyweight接口,并為其內部狀態增加存儲空間 class ConcreteFlyweight extends Flyweight { /** * 實例化時就接受外部狀態 * @param String $extrinsic [description] */ public function __construct($extrinsic) { parent::__construct($extrinsic); } /** * 根據外部狀態進行邏輯處理 * @param int $extrinsic [description] * @return [type] [description] */ public function operate($extrinsic) { echo "具體Flyweight:".$extrinsic."<br>"; } } //指那些不需要共享的Flyweight子類。 class UnsharedConcreteFlyweight extends Flyweight { /** * * @param String $extrinsic [description] */ public function __construct($extrinsic) { parent::__construct($extrinsic); } /** * * @param int $extrinsic [description] * @return [type] [description] */ public function operate($extrinsic) { echo "不共享的具體Flyweight:" . $extrinsic ."<br>"; } } //享元工廠,用來創建并管理Flyweight對象 class FlyweightFactory { //定義一個池容器 private $pool =array(); //享元工廠 /** * / * @param String $extrinsic [description] * @return Flyweight [description] */ public function getFlyweight(String $extrinsic) { if(!isset($this->pool[$extrinsic])) { //池中沒有該對象 //根據外部狀態創建享元對象并放入池中 $this->pool[$extrinsic] = new ConcreteFlyweight($extrinsic); echo "創建 " . $extrinsic . " 并從池中取出----><br>"; }else{ echo "已有 " . $extrinsic . " 直接從池中取----><br>"; } return $this->pool[$extrinsic]; } } class Client { public static function main() { $extrinsic = 22; $FlyweightFactory= new FlyweightFactory(); $flyweightX = $FlyweightFactory->getFlyweight("X"); $flyweightX->operate(++$extrinsic); $flyweightY = $FlyweightFactory->getFlyweight("Y"); $flyweightY->operate(++$extrinsic); $flyweightZ = $FlyweightFactory->getFlyweight("Z"); $flyweightZ->operate(++$extrinsic); $flyweightReX = $FlyweightFactory->getFlyweight("X"); $flyweightReX->operate(++$extrinsic); //不共享的直接new 而不經過享元工廠 $unsharedFlyweight = new UnsharedConcreteFlyweight("X"); $unsharedFlyweight->operate(++$extrinsic); } } Client::main(); 結果: 創建 X 并從池中取出----> 具體Flyweight:23 創建 Y 并從池中取出----> 具體Flyweight:24 創建 Z 并從池中取出----> 具體Flyweight:25 已有 X 直接從池中取----> 具體Flyweight:26 不共享的具體Flyweight:27 ``` ## **享元模式的擴展** (1)**單純享元模式**,這種享元模式中的所有的具體享元類都是可以共享的,不存在非共享的具體享元類,其結構圖如圖所示。 ![](https://img.kancloud.cn/41/0b/410b32f9c30cd180db6a8fdf10664900_513x496.png) (2) **復合享元模式**,這種享元模式中的有些享元對象是由一些單純享元對象組合而成的,它們就是復合享元對象。雖然復合享元對象本身不能共享,但它們可以分解成單純享元對象再被共享,其結構圖如圖所示 ![](https://img.kancloud.cn/f4/4c/f44c3008047178b4973127251e6f1c08_769x518.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看