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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 抽象工廠模式解釋 > 原文: [https://howtodoinjava.com/design-patterns/creational/abstract-factory-pattern-in-java/](https://howtodoinjava.com/design-patterns/creational/abstract-factory-pattern-in-java/) **抽象工廠模式**是又一個[創造型設計模式](//howtodoinjava.com/category/design-patterns/creational/ "creational design patterns"),并且被視為[工廠模式](//howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/ "Implementing factory design pattern in java")的另一抽象層。 在本教程中,我們將擴展[工廠模式](//howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/ "Implementing factory design pattern in java")中討論的汽車工廠問題的范圍。 我們將通過擴大汽車工廠的范圍來學習何時使用工廠模式,然后通過抽象工廠模式解決擴展的范圍。 ```java Table of Contents 1\. Design global car factory using abstract factory pattern 2\. Abstract factory pattern based solution 3\. Abstract factory pattern implementation 4\. Summary ``` ## 1.使用抽象工廠模式設計全局汽車工廠 在“ [工廠設計模式](//howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/ "Implementing factory design pattern in java")”中,我們討論了如何針對各種汽車模型類型以及其包含在汽車制造過程中的附加邏輯來抽象汽車制造過程。 現在,想象一下我們的汽車制造商是否決定走向全局。 為了支持**全局運營**,我們將需要增強系統以支持不同國家/地區的不同汽車制造風格。 例如,在某些國家/地區中,方向盤位于左側,而在某些國家/地區中,其方向盤位于右側。 在汽車的不同部分及其制造過程中可能還會存在更多此類差異。 為了描述抽象工廠模式,我們將考慮三種制造方式 - 所有其他國家/地區的*美國*,*亞洲*和*默認*。 支持多個位置將需要進行關鍵的設計更改。 首先,我們需要在問題說明中指定的每個**位置**中都有汽車工廠。 即`USACarFactory`,`AsiaCarFactory`和`DefaultCarFactory`。 現在,我們的應用應該足夠智能,可以識別使用的位置,因此我們應該能夠使用適當的汽車工廠,甚至不知道內部將使用哪個汽車工廠實現。 這也可以避免我們為某個特定位置稱呼錯誤的工廠。 因此,基本上,我們需要另一層抽象,它將識別位置并在內部使用正確的汽車工廠實現方式,甚至不會向用戶提供任何提示。 這正是使用抽象工廠模式來解決的問題。 ## 2.基于抽象工廠模式的解決方案 #### 2.1 包圖 使用抽象工廠模式參與全局汽車工廠設計的類的類圖。 ![Abstract factory design pattern package diagram](https://img.kancloud.cn/19/54/195443446449f212d2f6dce2790f59ec_1177x969.png "Abstract_factory_package_diagram") #### 2.2 時序圖 此圖顯示了`CarFactory`工廠類背后的類與抽象之間的交互。 ![abstract factory design pattern sequence diagram](https://img.kancloud.cn/c0/90/c090b5c042cd8d5f6b0f6af23a1006c1_1007x614.png "abstract_factory_sequence_diagram") > 請注意,我已設計解決方案以完全隱藏最終用戶的位置詳細信息。 因此,我沒有直接暴露任何特定于位置的工廠。 > > 在替代解決方案中,我們可以首先基于`location`參數獲取特定于位置的工廠,然后在抽象引用上使用其`buildCar()`方法來構建實際的汽車實例。 ## 3.抽象工廠模式實現 Java 類為全局汽車工廠實現抽象工廠模式。 首先,我們必須為不同的位置編寫所有獨立的汽車工廠。 為了支持特定于位置的功能,請首先使用另一個屬性`location`修改`Car.java`類。 ```java public abstract class Car { public Car(CarType model, Location location){ this.model = model; this.location = location; } protected abstract void construct(); private CarType model = null; private Location location = null; //getters and setters @Override public String toString() { return "Model- "+model + " built in "+location; } } ``` 這增加了創建另一個用于存儲不同位置的枚舉的工作。 ```java public enum Location { DEFAULT, USA, ASIA } ``` 所有汽車類型還將具有附加的`location`屬性。 我們只為豪華車而寫。 小轎車和轎車也是如此。 ```java public class LuxuryCar extends Car { public LuxuryCar(Location location) { super(CarType.LUXURY, location); construct(); } @Override protected void construct() { System.out.println("Building luxury car"); //add accessories } } ``` 到目前為止,我們已經創建了基本類。 現在讓我們擁有不同的汽車工廠,這是抽象工廠模式背后的核心思想。 ```java public class AsiaCarFactory { public static Car buildCar(CarType model) { Car car = null; switch (model) { case SMALL: car = new SmallCar(Location.ASIA); break; case SEDAN: car = new SedanCar(Location.ASIA); break; case LUXURY: car = new LuxuryCar(Location.ASIA); break; default: //throw some exception break; } return car; } } ``` ```java public class DefaultCarFactory { public static Car buildCar(CarType model) { Car car = null; switch (model) { case SMALL: car = new SmallCar(Location.DEFAULT); break; case SEDAN: car = new SedanCar(Location.DEFAULT); break; case LUXURY: car = new LuxuryCar(Location.DEFAULT); break; default: //throw some exception break; } return car; } } ``` ```java public class USACarFactory { public static Car buildCar(CarType model) { Car car = null; switch (model) { case SMALL: car = new SmallCar(Location.USA); break; case SEDAN: car = new SedanCar(Location.USA); break; case LUXURY: car = new LuxuryCar(Location.USA); break; default: //throw some exception break; } return car; } } ``` 好吧,現在我們所有 3 個不同的汽車工廠。 現在,我們必須抽象化訪問這些工廠的方式。 ```java public class CarFactory { private CarFactory() { //Prevent instantiation } public static Car buildCar(CarType type) { Car car = null; Location location = Location.ASIA; //Read location property somewhere from configuration //Use location specific car factory switch(location) { case USA: car = USACarFactory.buildCar(type); break; case ASIA: car = AsiaCarFactory.buildCar(type); break; default: car = DefaultCarFactory.buildCar(type); } return car; } } ``` 我們已經完成編寫代碼。 現在,讓我們測試一下工廠和汽車。 ```java public class TestFactoryPattern { public static void main(String[] args) { System.out.println(CarFactory.buildCar(CarType.SMALL)); System.out.println(CarFactory.buildCar(CarType.SEDAN)); System.out.println(CarFactory.buildCar(CarType.LUXURY)); } } ``` 程序輸出: ```java Output: (Default location is Asia) Building small car Model- SMALL built in ASIA Building sedan car Model- SEDAN built in ASIA Building luxury car Model- LUXURY built in ASIA ``` ## 4.總結 我們已經看到了[工廠模式](//howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/ "Implementing factory design pattern in java")的用例場景,因此,每當需要**一組工廠**上的另一個抽象級別時,都應考慮使用*抽象工廠模式*。 工廠模式與抽象工廠模式之間可能只是**這些區別**。 您已經可以更深入地研究 JDK 分發中的抽象工廠的不同*實時示例*: * [`DocumentBuilderFactory#newInstance()`](https://docs.oracle.com/javase/6/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#newInstance%28%29 "DocumentBuilderFactory newinstance") * [`TransformerFactory#newInstance()`](https://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html#newInstance%28%29 "TransformerFactory newInstance") 還有其他類似的示例,但是需要對**抽象工廠設計模式**有所了解,這是您到目前為止必須已經掌握的。 學習愉快! 參考文獻: [抽象工廠 – 維基百科](https://en.wikipedia.org/wiki/Abstract_factory_pattern)
                  <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>

                              哎呀哎呀视频在线观看