<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>

                享元模式 (Flyweight Pattern): 池技術的重要實現方式, 運用共享技術有效的支持大量的細粒度對象,用于減少創建對象的數量,以減少內存占用和提高性能。 ## (一)為什么需要享元模式 1,在有大量對象時,有可能會造成內存溢出,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接返回在內存中已有的對象,避免重新創建。 2,系統有大量相似對象。 3,需要緩沖池的場景。 ## (二)享元模式UML圖 ![](https://box.kancloud.cn/109fa428aea41b06f8123f3cf146e8b5_1145x584.png) ## (三)簡單實例 這里引用《設計模式之禪》的例子,就是如果有一個報考信息系統,每個考生進來就實例化一個對象,傳入他要報考的考點。由于考生分為30個考點,所以其實我們沒有必要不停的實例化對象并釋放,我們完全可以做一個緩沖池,若緩沖池中沒有與這個考生相同考點的對象,則實例化一個,使用完不需要釋放。下一個相同考點的考生進來后,只需復用這個對象。 <?php //抽象享元對象 abstract class Flyweight{ //考點 public $address; //享元角色必修設置考點 public function __construct($address){ $this->address = $address; } } //具體享元角色 考生類 class ConcreteFlyweight extends Flyweight{ //報考動作 public function register(){ echo "我的報考點是:{$this->address}".PHP_EOL; } //退出 public function quit(){ unset($this); } } //享元工廠 緩沖池 class FlyweightFactor{ static private $students = array(); static public function getStudent($address){ $students =self::$students; //判斷該鍵值是否存在 if(array_key_exists($address,$students)){ echo "緩沖池有考點為{$address},從池中直接取".PHP_EOL; }else{ echo "緩沖池沒有,創建了考點為{$address}的對象并放到池中".PHP_EOL; self::$students[$address] = new ConcreteFlyweight($address); } return self::$students[$address]; } } //實例化學生對象 $student_1 = FlyweightFactor::getStudent('廣州'); //報考 $student_1 ->register(); // 退出 $student_1->quit(); //第二個學生進來 $student_2 = FlyweightFactor::getStudent('東莞'); //報考 $student_2 ->register(); // 退出 $student_2->quit(); //第三個學生進來 $student_3 = FlyweightFactor::getStudent('廣州'); //報考 $student_3 ->register(); // 退出 $student_3->quit(); 這里我們可以看到,當第三個學生進來時,由于和第一個學生的報考地點一致,所以只需從緩沖池取出。 ps:雖然ConcreteFlyweight的quit方法unset了$this,但是由于在FlyweightFactor中的students還存放著這個對象,所以unset只釋放了變量$student_1,并沒有完全刪除這個對象,這就是student_3進來還能從緩沖池取得對象的原因 享元模式在PHP中可能比較少遇,但在Java中常常有這種情況。就是代碼產生了大量的對象,雖然使用完有釋放,但是由于垃圾回收需要一定時間,導致內存被耗盡。PHP經常應用web編程,腳本執行時間很短(30秒)。所以很少遇見這種情況,甚至我們使用完變量,連unset()函數都不用調用,就等著腳步執行結束后,自動釋放。但是如果你試過在cli模式下運行PHP腳本,做一些socket通信,發送郵件等長耗時或是多連接任務時,就難免會遇到這種情況。
                  <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>

                              哎呀哎呀视频在线观看