首頁 Java Java基礎 java的三種工廠模式是什麼?

java的三種工廠模式是什麼?

Nov 02, 2020 pm 02:23 PM
java 工廠模式

java的三種工廠模式:1、簡單工廠模式,提供一個創建物件實例的功能,而無須關心其具體實現;2、工廠方法模式;3、抽象工廠模式,提供一個創建一系列相關或相互依賴物件的接口,無須指定它們特定的類別。

java的三種工廠模式是什麼?

(推薦教學:java入門教學

一、簡單工廠模式

簡單工廠的定義:提供一個建立物件實例的功能,而無須關心其具體實作。被建立實例的類型可以是介面、抽象類,也可以是具體的類別

實作汽車介面

public interface Car {
    String getName();
}

#賓士類別

public class Benz implements Car {
    @Override
    public String getName() {
        return "Benz";
    }
}

BMW類別

public class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

#簡單工廠,既能生產寶馬又能生產賓士

public class SimpleFactory {
    public Car getCar(String name){
        if (name.equals("BMW")){
            return new BMW();
        }else if (name.equals("benz")){
            return new Benz();
        }else {
            System.out.println("不好意思,这个品牌的汽车生产不了");
            return null;
        }
    }
}

#測試類別

public class SimpleFactoryTest {
    public static void main(String[] args){
        SimpleFactory simpleFactory = new SimpleFactory();
        Car car = simpleFactory.getCar("BMW");
        System.out.println(car.getName());
    }
}

測試結果

BMW

根據簡單工廠的定義,使用者只要產品而不在乎產品如何生產,看起來好像很完美的樣子。但大家想想,這個世界存在著什麼都生產的工廠嗎?

顯然是不存在的,每個汽車品牌都有自己的生產工廠,都有自己生產技術。映射到spring框架中,我們有很多很多種的bean需要生產,如果只依靠一個簡單工廠來實現,那麼我們得在工廠類中嵌套多少個if..else if啊?

而且我們在程式碼中生產一輛汽車只是new一下就出來了,但實際操作中卻不知道需要進行多少操作,加載、註冊等操作都將體現在工廠類中,那麼這個類就會變得紊亂,管理起來也很不方便,所以說每個品牌應該要有自己的生產類。

因為專一,所以專業嘛,這時候工廠方法就出現了。

二、工廠方法模式

工廠介面

#
//定义一个工厂接口,功能就是生产汽车
public interface Factory {
    Car getCar();
}

賓士工廠##

public class BenzFactory implements Factory {
    @Override
    public Car getCar() {
        return new Benz();
    }
}

BMW工廠

public class BMWFactory implements Factory{
    @Override
    public Car getCar() {
        return new BMW();
    }
}

測試類別

public class FactoryTest {
   public static void main(String[] args){
       Factory bmwFactory = new BMWFactory();
       System.out.println(bmwFactory.getCar().getName());
       Factory benzFactory = new BenzFactory();
       System.out.println(benzFactory.getCar().getName());
   }
}

測試結果

BMW
Benz
根據上述程式碼可以看出,不同品牌的汽車是由不同的工廠生產的,似乎又是很完美的。但大家看一下測試類,當一個人想要去買一輛寶馬汽車的時候(假設沒有銷售商),那麼他就要去找寶馬工廠給他生產一輛,過幾天又想買一輛奔馳汽車的時候,又得跑到賓士工廠請人生產,無疑增加了使用者的操作複雜性。所以有沒有一種方便使用者操作的方法呢?這時候抽象工廠模式就出現了。

三、抽象工廠模式

 抽象工廠

public abstract class AbstractFactory {

     protected abstract Car getCar();
     
     //这段代码就是动态配置的功能
     //固定模式的委派
     public Car getCar(String name){
        if("BMW".equalsIgnoreCase(name)){
            return new BmwFactory().getCar();
        }else if("Benz".equalsIgnoreCase(name)){
            return new BenzFactory().getCar();
        }else if("Audi".equalsIgnoreCase(name)){
            return new AudiFactory().getCar();
        }else{
            System.out.println("这个产品产不出来");
            return null;
        }
    }
}

預設工廠

public class DefaultFactory extends AbstractFactory {

    private AudiFactory defaultFactory = new AudiFactory();
    
    public Car getCar() {
        return defaultFactory.getCar();
    }

}

BMW工廠

public class BMWFactory extends AbstractFactory {
    @Override
    public Car getCar() {
        return new BMW();
    }
}

#賓士工廠

public class BenzFactory extends AbstractFactory {
    @Override    public Car getCar() {
            return new Benz();
    }
}

 測試類別


public class AbstractFactoryTest {
    public static void main(String[] args) {        
        DefaultFactory factory = new DefaultFactory();        
        System.out.println(factory.getCar("Benz").getName());            
    }
}

測試結果

Benz
根據上述程式碼可以看出,使用者需要一輛汽車,只需要去找預設的工廠提出自己的需求(傳入參數),便能得到自己想要產品,而不用根據產品去尋找不同的生產工廠,方便使用者操作。

註:對於設計模式,有些人嗤之以鼻,有些人敬若神明,但我是認可的。

按我粗淺的理解,設計模式的經典之處,就在於解決了編寫程式碼的人和呼叫程式碼的人雙方的痛楚,不同的設計模式也只適用於不同的場景。至於用或不用,如何使用,那就需要各位看官著重考慮了。

但為了使用而使用是不應該的,細微之處,只有留給大家慢慢品味了。

更多程式相關知識,請造訪:

程式設計課程! !

以上是java的三種工廠模式是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP教程
1511
276
python argparse需要參數示例 python argparse需要參數示例 Aug 11, 2025 pm 09:42 PM

在使用argparse模塊時,必須提供的參數可通過設置required=True來實現,1.使用required=True可將可選參數(如--input)設為必填,運行腳本時若未提供會報錯;2.位置參數默認必填,無需設置required=True;3.建議必要參數使用位置參數,偶爾必須的配置再使用required=True的可選參數,以保持靈活性;4.required=True是控制參數必填最直接的方式,使用後用戶調用腳本時必須提供對應參數,否則程序將提示錯誤並退出。

Java的評論是什麼? Java的評論是什麼? Aug 12, 2025 am 08:20 AM

評論Incominjavaareignoredbythecompilereranded forexplanation,notes,OrdisablingCode.thereareThreetypes:1)單位linecommentsStartWith // andlastuntiltheEndoftheline; 2)Multi-lineCommentsBebeNWITH/ANDENCOMMENTBEMEMENT/ANDENDWITH/ANDENDWITH/ANDENDWITH/ANDENDWITH/ANDENDWITH/ANDENDWITH/ANDENDWITH/ANDCANSPANMELTIPLICEMENTS; 3)文檔

Java開發的最佳IDE:比較評論 Java開發的最佳IDE:比較評論 Aug 12, 2025 pm 02:55 PM

ThebestJavaIDEin2024dependsonyourneeds:1.ChooseIntelliJIDEAforprofessional,enterprise,orfull-stackdevelopmentduetoitssuperiorcodeintelligence,frameworkintegration,andtooling.2.UseEclipseforhighextensibility,legacyprojects,orwhenopen-sourcecustomizati

如何在Java中使用httpclient API 如何在Java中使用httpclient API Aug 12, 2025 pm 02:27 PM

使用JavaHttpClientAPI的核心是創建HttpClient、構建HttpRequest並處理HttpResponse。 1.使用HttpClient.newHttpClient()或HttpClient.newBuilder()配置超時、代理等創建客戶端;2.使用HttpRequest.newBuilder()設置URI、方法、頭和體來構建請求;3.通過client.send()發送同步請求或client.sendAsync()發送異步請求;4.使用BodyHandlers.ofStr

如何比較爪哇的弦 如何比較爪哇的弦 Aug 12, 2025 am 10:00 AM

使用.equals()比較字符串內容,因為==僅比較對象引用而非實際字符;2.進行忽略大小寫的比較時使用.equalsIgnoreCase();3.需要按字母順序排序時使用.compareTo(),忽略大小寫則用.compareToIgnoreCase();4.避免對可能為null的字符串調用.equals(),應使用"literal".equals(variable)或Objects.equals(str1,str2)來安全處理null值;總之,始終關注內容比較而非引用,確

Java中的LinkedList是什麼? Java中的LinkedList是什麼? Aug 12, 2025 pm 12:14 PM

LinkedList在Java中是一個雙向鍊錶,實現了List和Deque接口,適用於頻繁插入和刪除元素的場景,尤其在列表兩端操作時效率高,但隨機訪問性能較差,時間複雜度為O(n),而插入和刪除在已知位置時可達到O(1),因此適合用於實現棧、隊列或需要動態修改結構的場合,而不適合頻繁按索引訪問的讀密集型操作,最終結論是LinkedList在修改頻繁但訪問較少時優於ArrayList。

邊緣不保存歷史記錄 邊緣不保存歷史記錄 Aug 12, 2025 pm 05:20 PM

首先,Checkif“ ClearBrowsingDataOnclose” IsturnedonInsettingsandTurnitOfftoensureHistoryIsSaved.2.Confirmyou'renotusinginprivateMode,asitdoesnotsavehistorybydesign.3.disborextimentsextionsextionsextionsextementsextionsextionsextionsextextiensextextionsporextiensporextiensporlyTorluleuleuleuleOutInterferfereframprivacyOrad bacyorad blockingtoo

Excel查找並更換不工作 Excel查找並更換不工作 Aug 13, 2025 pm 04:49 PM

checkSearchSettingStingsTike“ matchentirecellcontents”和“ matchcase” byexpandingOptionsInfindReplace,確保“ lookin” insettovaluesand and“ tocorrectscope; 2.2.look forhiddenChindChareChideCharacterSorformattingTingtingTingTingBycopypopyBycopyingByingTextDextDirectly

See all articles