<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國際加速解決方案。 廣告
                ### 概述 是類的創建模式,又叫做簡單方法模式,靜態產品模式是一個工廠對象決定創建出哪一種產品類的實例. ### 優點 使用靜態工廠模式的優點是實現責任的分割,該模式的核心是工廠類,工廠類含有必要的選擇邏輯,可以決定什么時候創建哪一個產品的實例,而客戶端則免去直接創建產品的責任,而 僅僅是消費產品。也就是說靜態工廠模式在不改變客戶端代碼的情況可以動態的增加產品。(總有人對靜態工廠模式增加產品后客戶端代碼不改變存有疑問,這里指的不改變,是指原來的 消費產品的代碼不必改變,您如果是要消費新的產品當然得把新的產品加上啊),也就在某種程度上滿足開閉原則,但它并不完全滿足開閉原則,因為沒當增加新的產品時,都需要修 改工廠類,所以出現了以后的工廠方法模式。 ### 為什么工廠類中的方法必須是靜態的? 其實這樣不用靜態的在語法上并沒有錯誤,但卻完全沒理解面向對象設計的精髓。 如果直接new出Factory的對象,客戶端就必須自己控制工廠類的構造和生成,客戶端必須非常清楚工廠的構造函數(比如構造函數有多少個參數,輸入參數時有什么條件等等),也知道 工廠的內部細節,一旦工廠擴展或者改變了,客戶端在沒有得到通知的情況下就不知道怎么調用了。而是用靜態方法構造客戶端則完全不關心你是如何構造對象的所以客戶端不需要了解 工廠的構造細節,一旦工廠內部發生變化,客戶端也不需要關心。它只需要關心最后的結果就行了,因為所有的細節都在工廠內部被處理完了。 ### 實例 ~~~ /** * 虛擬產品接口 */ interface Fruit{ public function grow(); //生長 public function plant(); //種植 public function harvest(); //收獲 public function eat(); //食用 } /** * 定義具體產品,實現接口 */ class Apple implements Fruit{ private $treeAge; private $color; public function grow() { echo "apple grow"; } public function plant() { echo "apple plant"; } public function harvest() { echo "apple harvest"; } public function eat() { echo "apple eat"; } public function getTreeAge() { return $this->treeAge; } public function setTreeAge($age) { $this->treeAge = $age; return true; } } class Grape implements Fruit{ private $seedLess; public function grow() { echo "grape grow"; } public function plant() { echo "grape plant"; } public function harvest() { echo "grape harvest"; } public function eat() { echo "grape eat"; } public function getSeedLess() { return $this->seedLess; } public function setSeedLess($seed) { $this->seedLess = $seed; return true; } } /** * 定義靜態工廠 */ class Factory{ public static function create($fruitName) { switch($fruitName){ case "Apple": return new Apple(); break; case "Grape": return new Grape(); break; default: throw new badFruitException("Error no the fruit"); break; } } } class badFruitException extends Exception{ public $msg; public $errType; public function __construct($message = "", $code = 1, Throwable $previous = null) { $this->msg = $message; $this->errType = $code; } } try{ $appleInstance = Factory::create("Apple"); var_dump($appleInstance); } catch(badFruitException $err){ echo $err->msg . "--" . $err->errType; } ~~~
                  <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>

                              哎呀哎呀视频在线观看