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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java 工廠模式說明 > 原文: [https://howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/](https://howtodoinjava.com/design-patterns/creational/implementing-factory-design-pattern-in-java/) 在 Java 中創建類實例的最常用方法是什么? 大多數人會回答這個問題:“*使用`new`新關鍵字*”。 好吧,它現在被認為是老式的。 讓我們看看如何? 如果對象創建代碼散布在整個應用中,并且如果您需要更改對象創建過程,則需要在每個地方進行必要的更改。 在完成本文之后,在編寫應用時,請考慮使用 **Java 工廠模式**。 在我以前的文章“ Java 中的 [**單例設計模式**](//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/ "Singleton design pattern in?java")”中,我們討論了創建類實例的各種方法,以使同一 JVM 中不存在同一類的另一個實例。 在這篇文章中,我將演示另一個創建型模式,即[工廠模式](https://en.wikipedia.org/wiki/Factory_method_pattern "Factory pattern"),用于為您的類創建實例。 顧名思義,工廠是一個創建一些不同產品的地方,這些產品在功能上有些相似,但又分為幾類。 在 Java 中,工廠模式用于創建相同類型的不同類的實例。 ```java Table of Contents 1\. When to implement factory pattern? 2\. Factory Pattern Implementation 3\. Advantages of factory pattern 4\. Final notes ``` ## 1.什么時候使用工廠模式? 工廠模式引入了**類之間的松散耦合**,這是在設計應用架構時應考慮并應用的最重要的原則。 通過針對抽象實體(而不是具體的實現)進行編程,可以在應用架構中引入松耦合。 這不僅使我們的架構更加靈活,而且不那么脆弱。 一張圖片勝過千言萬語。 讓我們看看工廠實現的樣子。 [![](https://img.kancloud.cn/27/98/279838714088ff6f681a6d3e09ae4a98_1136x517.png "class_diagram_of_factory_pattern_in_java")](https://howtodoinjava.files.wordpress.com/2012/10/class_diagram_of_factory_pattern_in_java1.png) 上圖以汽車工廠為例描述了一種常見情況,該工廠能夠制造 3 種類型的汽車,即小型,轎車和豪華型汽車。 制造汽車需要從分配配件到最終化妝的許多步驟。 這些步驟可以作為方法編寫在程序中,并在創建特定汽車類型的實例時調用。 如果很不幸,那么我們將在我們的應用類中創建汽車類型的實例(例如`SmallCar`),因此我們會將汽車制造邏輯暴露給外界,這當然不好。 這也阻止了我們對汽車制造過程的更改,因為代碼不是集中的,并且在所有組成類中進行更改似乎都不可行。 ## 2\. Java 工廠模式示例 到目前為止,我們已經設計了用于制造`CarFactory`的類。 現在創建它們。 #### 2.1 對象類型 `CarType`將保留汽車類型,并將為所有其他類別提供汽車類型。 ```java package designPatterns.creational.factory; public enum CarType { SMALL, SEDAN, LUXURY } ``` #### 2.2 對象實現 `Car`是所有汽車實例的父類,并且還將包含適用于所有類型汽車的通用邏輯。 ```java package designPatterns.creational.factory; public abstract class Car { public Car(CarType model) { this.model = model; arrangeParts(); } private void arrangeParts() { // Do one time processing here } // Do subclass level processing in this method protected abstract void construct(); private CarType model = null; public CarType getModel() { return model; } public void setModel(CarType model) { this.model = model; } } ``` `LuxuryCar`是`LUXURY`型汽車的具體實現。 ```java package designPatterns.creational.factory; public class LuxuryCar extends Car { LuxuryCar() { super(CarType.LUXURY); construct(); } @Override protected void construct() { System.out.println("Building luxury car"); // add accessories } } ``` `SmallCar`是`SMALL`型汽車的具體實現。 ```java package designPatterns.creational.factory; public class SmallCar extends Car { SmallCar() { super(CarType.SMALL); construct(); } @Override protected void construct() { System.out.println("Building small car"); // add accessories } } ``` `SedanCar`是`SEDAN`型汽車的具體實現。 ```java package designPatterns.creational.factory; public class SedanCar extends Car { SedanCar() { super(CarType.SEDAN); construct(); } @Override protected void construct() { System.out.println("Building sedan car"); // add accessories } } ``` #### 2.3 創建對象的工廠 `CarFactory.java`是我們使用工廠模式實現的主要類。 僅在確定實例類型之后,才會實例化實例。 ```java package designPatterns.creational.factory; public class CarFactory { public static Car buildCar(CarType model) { Car car = null; switch (model) { case SMALL: car = new SmallCar(); break; case SEDAN: car = new SedanCar(); break; case LUXURY: car = new LuxuryCar(); break; default: // throw some exception break; } return car; } } ``` #### 2.4 測試工廠模式 在`TestFactoryPattern`中,我們將測試我們的工廠代碼。 讓我們運行這個類。 ```java package designPatterns.creational.factory; 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 Building small car designPatterns.creational.factory.SmallCar@7c230be4 Building sedan car designPatterns.creational.factory.SedanCar@60e1e567 Building luxury car designPatterns.creational.factory.LuxuryCar@e9bfee2 ``` 如您所見,工廠可以退回所要求的任何類型的汽車實例。 這將幫助我們在汽車制造過程中進行任何形式的更改,甚至無需觸及組成類,即使用`CarFactory`的類。 ## 3.工廠模式的好處 到目前為止,您應該能夠算出使用工廠模式的主要優勢。 讓我們記下: 1. 對象的創建可避免其重用,而無需大量重復代碼。 2. 創建對象需要訪問不應包含在組成類中的信息或資源。 3. 必須集中管理所生成對象的生命周期管理,以確保應用內行為的一致性。 ## 4.最后的筆記 **工廠模式最適合涉及一些復雜的對象創建步驟的地方**。 為確保這些步驟集中進行,并且不暴露于編寫類中,應使用工廠模式。 我們可以在 JDK 本身中看到許多實時的工廠模式示例,例如: * [`java.sql.DriverManager#getConnection()`](https://docs.oracle.com/javase/10/docs/api/java/sql/DriverManager.html#getConnection%28java.lang.String%29 "driver manager get connection") * [`java.net.URL#openConnection()`](https://docs.oracle.com/javase/10/docs/api/java/net/URL.html#openConnection%28%29 "url open connection") * [`java.lang.Class#newInstance()`](https://docs.oracle.com/javase/10/docs/api/java/lang/Class.html#newInstance%28%29 "class new instance") * [`java.lang.Class#forName()`](https://docs.oracle.com/javase/10/docs/api/java/lang/Class.html#forName%28java.lang.String%29 "class forname") 希望我在此 **Java 工廠模式示例**中包含了足夠的信息,以使該帖子內容豐富。 如果您對 Java 中的抽象工廠設計模式仍有疑問,請發表評論。 我很樂意與您討論。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看