<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 1. 工廠模式 ### 1. 工廠模式說明 #### 1.1 什么是工廠模式 工廠模式的作用是屏蔽創建對象過程中的具體過程,以便提高創建對象過程的靈活性,使使用者不必關心構造對象的細節和復雜的過程。 #### 1.2 什么時候使用 **1. 如果一個對象擁有很多子類**,那么創建該對象的子類使用工廠模式是最合適的,不但可以面向接口的編程,為維護以及開發帶來方便。 **2. 如果創建某個對象時需要進行許多額外的操作**,如查詢數據庫然后將查詢到的值賦予要創建的對象(單例初始化時使用比較多),或是需要許多額外的賦值等等。如果查看JDK源碼中,會發現許多成員變量在對象構造時,通過工廠方法進行創建的。因為這些成員變量本身的創建也很復雜。不可能創建對象時,在該對象的構造方法里創建成員變量然后再賦值給該成員變量。而且使用工廠模式也提高了代碼的重用性。 > 面向對象的編程的思想是分派和封裝,即為將復雜的代碼分派成多個代碼塊,然后對這些代碼塊進行封裝,這樣如果需要修改只修改每段即可,而不會牽一發而動全身,小功能解耦。 #### 1.3 工廠模式中的角色 在工廠模式中一般存在以下三個類型的角色,分別是: 1. **產品類** :最終產出的產品 2. **工廠類**:就是生產產品的工廠 3. **客戶類**: 是最終產品的需求者。 ### 2. 工廠模式實現方式 #### 2.1 單工廠模式(Simple Factory) 簡單工廠模式對上面提到的工廠模式中三個類型角色中的產品類進行了修改, **把產品類進行了抽象,分成了抽象產品角色和具體產品角色,其他角色類不變。** 抽象產品角色一般是具體產品類需要繼承的父類或者需要實現的接口,而具體產品角色就是工廠類中需要創建的產品實例。 > 1. 定義產品類接口 > 2. 具體的產品類實現產品接口 > 3. 工廠類根據傳入的不同的值,返回不同的產品類對象 > 4. 不修改代碼的話,是無法擴展的。 1. 產品類 ![](https://box.kancloud.cn/a95541cd84cdb93fbaa09da425fa043f_473x274.png) 2. 工廠類 ![](https://box.kancloud.cn/9d6590fdde8f92c929d09157cd6c8e22_376x276.png) 3. 客戶類 ![](https://box.kancloud.cn/0001bb84e536a00d1d257bb2f2e734d2_482x118.png) #### 2.2 工廠方法模式(Factory Method) 工廠方法模式對上面提到的簡單工廠模式又進行了一部分修改,在簡單工廠模式的基礎上把工廠類進行了抽象,**分成了抽象工廠角色和具體工廠角色。** 抽象工廠角色是工廠方法模式中的核心部分,是必須由具體工廠角色進行繼承或者實現的父類或者接口。具體工廠角色在繼承或者實現抽象工廠角色后在自己的內部做具體的業務邏輯。 > 1. 在單工廠模式的基礎上 > 2. 為不同的產品類,創建不同的工廠類(相同的工廠接口和方法) > 3. 在同一等級結構中, 支持增加任意產品 。 1. 產品類 ![](https://box.kancloud.cn/a95541cd84cdb93fbaa09da425fa043f_473x274.png) 2. 工廠類 ![](https://box.kancloud.cn/a8d2f545c8140d56a79f91309e4bc63e_531x339.png) 3. 客戶類 ![](https://box.kancloud.cn/cf05a13991a9cc226ec21d0be1a22bd5_449x147.png) #### 2.3 抽象工廠模式(Abstract Factory) 提供一個接口,用于創建相關或依賴對象的家族,而不需要明確指定具體類。 在上述的場景上繼續延伸:咖啡工廠做大做強,引入了新的飲品種類:茶、 碳酸飲料。中國工廠只能制造咖啡和茶,美國工廠只能制造咖啡和碳酸飲料。 如果用上述工廠方法方式,除去對應的產品實體類還需要新增2個抽象工廠(茶制造工廠、碳酸飲料制造工廠),4個具體工廠實現。隨著產品的增多,會導致類爆炸。 所以這里引出一個概念**產品家族**,在此例子中,不同的飲品就組成我們的飲品家族, 飲品家族開始承擔創建者的責任,負責制造不同的產品。 **和工廠方法的區別是,抽象工廠往往有多種方法,可以生產多種產品,即產品簇。 ** ~~~ /** * 抽象的飲料產品家族制造工廠 * */ public interface AbstractDrinksFactory { /** * 制造咖啡 * @return */ Coffee createCoffee(); /** * 制造茶 * @return */ Tea createTea(); /** * 制造碳酸飲料 * @return */ Sodas createSodas(); } /** * 中國飲品工廠 * 制造咖啡與茶 * */ public class ChinaDrinksFactory implements AbstractDrinksFactory { @Override public Coffee createCoffee() { // TODO Auto-generated method stub return new Latte(); } @Override public Tea createTea() { // TODO Auto-generated method stub return new MilkTea(); } @Override public Sodas createSodas() { // TODO Auto-generated method stub return null; } } /** * 美國飲品制造工廠 * 制造咖啡和碳酸飲料 */ public class AmericaDrinksFactory implements AbstractDrinksFactory { @Override public Coffee createCoffee() { // TODO Auto-generated method stub return new Latte(); } @Override public Tea createTea() { // TODO Auto-generated method stub return null; } @Override public Sodas createSodas() { // TODO Auto-generated method stub return new CocaCola(); } } /** * 抽象工廠測試類 * */ public class AbstractFactoryTest { static void print(Drink drink){ if(drink == null){ System.out.println("產品:--" ); }else{ System.out.println("產品:" + drink.getName()); } } public static void main(String[] args) { AbstractDrinksFactory chinaDrinksFactory = new ChinaDrinksFactory(); Coffee coffee = chinaDrinksFactory.createCoffee(); Tea tea = chinaDrinksFactory.createTea(); Sodas sodas = chinaDrinksFactory.createSodas(); System.out.println("中國飲品工廠有如下產品:"); print(coffee); print(tea); print(sodas); AbstractDrinksFactory americaDrinksFactory = new AmericaDrinksFactory(); coffee = americaDrinksFactory.createCoffee(); tea = americaDrinksFactory.createTea(); sodas = americaDrinksFactory.createSodas(); System.out.println("美國飲品工廠有如下產品:"); print(coffee); print(tea); print(sodas); } } ~~~ **總結:** **簡單工廠**:一個工廠,通過給工廠類傳入不同的參數,產生不同的產品。不能算是真正意義上的設計模式,但可以將客戶程序從具體類解耦。(**一個產品接口**) **工廠方法**:在單工廠的基礎上,為不同的產品創建不同的工廠類(工廠類往往只有一個方法)使用繼承,把對象的創建委托給子類,由子類來實現創建方法,可以看作是抽象工廠模式中只有單一產品的情況。(**一個產品接口、一個工廠接口-包含一個方法**) 抽象工廠:在單工廠的基礎上,為不同的產品創建不同的工廠類(工廠類往往只有多個方法,來創建不同的產品)使用繼承使對象的創建被實現在工廠接口所暴露出來的方法中。(**一個產品接口、一個工廠接口-包含多個方法**)
                  <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>

                              哎呀哎呀视频在线观看