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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ###### 簡單代碼實現 ~~~ //工廠類 class Factor { // 生成對象方法 public 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; // 工廠生產特定類對象方法 public 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 { // 工廠生產特定類對象方法 public 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 { // 工廠生產特定類對象方法 public static function getInstance() { return new OperationAdd; } } // 減法器生產工廠 class MulFactor extends Factor { public static function getInstance() { return new OperationMul; } } // 文本輸入器生產工廠 class TextFactor extends Factor { public static function getInstance() {} } $mul = MulFactor::getInstance(); echo $mul->getVal(1, 2); ~~~ 作者:MonkeyNote 鏈接:https://www.jianshu.com/p/5a212a4cf958 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
                  <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>

                              哎呀哎呀视频在线观看