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

                在現實生活中社會分工越來越細,越來越專業化。各種產品有專門的工廠生產,徹底告別了自給自足的小農經濟時代,這大大縮短了產品的生產周期,提高了生產效率。同樣,在軟件開發中能否做到軟件對象的生產和使用相分離呢?能否在滿足“開閉原則”的前提下,客戶隨意增刪或改變對軟件相關對象的使用呢?這就是本節要討論的問題。 簡單工廠模式違背了開閉原則,而“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的產品,即滿足開閉原則。 #### 優點: * 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程。 * 靈活性增強,對于新產品的創建,只需多寫一個相應的工廠類。 * 典型的解耦框架。高層模塊只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。 #### 缺點: * 類的個數容易過多,增加復雜度 * 增加了系統的抽象性和理解難度 * 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決。 #### 應用場景: * 客戶只知道創建產品的工廠名,而不知道具體的產品名。如 TCL 電視工廠、海信電視工廠等。 * 創建對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供創建產品的接口。 * 客戶不關心創建產品的細節,只關心產品的品牌 ## 模式的結構與實現 工廠方法模式由抽象工廠、具體工廠、抽象產品和具體產品等4個要素構成。本節來分析其基本結構和實現方法。 #### 1\. 模式的結構 工廠方法模式的主要角色如下。 1. 抽象工廠(Abstract Factory):提供了創建產品的接口,調用者通過它訪問具體工廠的工廠方法 newProduct() 來創建產品。 2. 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的創建。 3. 抽象產品(Product):定義了產品的規范,描述了產品的主要特性和功能。 4. 具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間一一對應。 ``` <?php //抽象產品 namespace Factory\SimpleFactory; interface IShape { public draw(); } ``` ``` <?php //具體產品 namespace Factory\SimpleFactory; class Square implements IShape { public function draw() { return '畫一個正方形'; } } ``` ``` <?php //具體產品 namespace Factory\SimpleFactory; class Circle implements IShape { public function draw() { return '畫一個圓形'; } } ``` ``` <?php namespace Factory\SimpleFactory; //抽象工廠:提供了廠品的生成方法 interface AbstractFactory { public newShap(); } ``` ``` <?php //具體工廠 namespace Factory\SimpleFactory; class CircleFactory implements AbstractFactory { public function newShap(){ return new Circle(); } } ``` ``` <?php //具體工廠 namespace Factory\SimpleFactory; class SquareFactory implements AbstractFactory { public function newShap(){ return new Square(); } } ``` ``` <?php // client 調用方式, 可以解決簡單工廠違背開閉原則的問題 namespace Factory\SimpleFactory; $shape = (new CircleFactory())->newShap(); $sting = $shape->draw(); echo $sting; ```
                  <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>

                              哎呀哎呀视频在线观看