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

                >工廠模式(Factor Pattern),就是負責生成其他對象的類或方法,也叫工廠方法模式 抽象工廠模式( Abstract Factor Pattern),可簡單理解為工廠模式的升級版 ## (一)為什么需要工廠模式 1,工廠模式可以將對象的生產從直接new 一個對象,改成通過調用一個工廠方法生產。這樣的封裝,代碼若需修改new的對象時,不需修改多處new語句,只需更改生產對象方法。 2,若所需實例化的對象可選擇來自不同的類,可省略if-else多層判斷,給工廠方法傳入對應的參數,利用多態性,實例化對應的類。 ## (二)工廠模式結構圖 1,工廠方法模式 ![](https://box.kancloud.cn/9322a9aa63515c732fcfa881d31bc2ee_867x443.png) 2,抽象工廠模式 ![](https://box.kancloud.cn/3a6779f6b19e1baad153373863eda548_485x347.png) (三)簡單實現代碼 //工廠類 class Factor{ //生成對象方法 static function createDB(){ echo '我生產了一個DB實例'; return new DB; } } //數據類 class DB{ public function __construct(){ echo __CLASS__.PHP_EOL; } } $db=Factor::createDB(); (四)實現一個運算器 //抽象運算類 abstract class Operation{ abstract public function getVal($i,$j);//抽象方法不能包含方法體 } //加法類 class OperationAdd extends Operation{ public function getVal($i,$j){ return $i+$j; } } //減法類 class OperationSub extends Operation{ public function getVal($i,$j){ return $i-$j; } } //計數器工廠 class CounterFactor { private static $operation; //工廠生產特定類對象方法 static function createOperation(string $operation){ switch($operation){ case '+' : self::$operation = new OperationAdd; break; case '-' : self::$operation = new OperationSub; break; } return self::$operation; } } $counter = CounterFactor::createOperation('+'); echo $counter->getVal(1,2); 缺點:若是再增加一個乘法運算,除了增加一個乘法運算類之外,還得去工廠生產方法里面添加對應的case代碼,違反了開放-封閉原則。 ### 解決方法(1):通過傳入指定類名 //計算器工廠 class CounterFactor { //工廠生產特定類對象方法 static function createOperation(string $operation){ return new $operation; } } class OperationMul extends Operation{ public function getVal($i,$j){ return $i*$j; } } $counter = CounterFactor::createOperation('OperationMul'); ### 解決方法(2):通過抽象工廠模式 這里順帶提一個問題:如果我系統還有個生產一個文本輸入器工廠,那么那個工廠和這個計數器工廠又有什么關系呢。 抽象高于實現 其實我們完全可以抽象出一個抽象工廠,然后將對應的對象生產交給子工廠實現。代碼如下 //抽象運算類 abstract class Operation{ abstract public function getVal($i,$j);//抽象方法不能包含方法體 } //加法類 class OperationAdd extends Operation{ public function getVal($i,$j){ return $i+$j; } } //乘法類 class OperationMul extends Operation{ public function getVal($i,$j){ return $i*$j; } } //抽象工廠類 abstract class Factor{ abstract static function getInstance(); } //加法器生產工廠 class AddFactor extends Factor { //工廠生產特定類對象方法 static function getInstance(){ return new OperationAdd; } } //減法器生產工廠 class MulFactor extends Factor { static function getInstance(){ return new OperationMul; } } //文本輸入器生產工廠 class TextFactor extends Factor{ static function getInstance(){} } $mul = MulFactor::getInstance(); echo $mul->getVal(1,2);
                  <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>

                              哎呀哎呀视频在线观看