国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

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

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

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

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

(推薦教學:java入門教學

一、簡單工廠模式

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

實作汽車介面

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";
????}
}

#簡單工廠,既能生產(chǎn)寶馬又能生產(chǎn)賓士

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("不好意思,這個品牌的汽車生產(chǎn)不了");
????????????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());
????}
}

測試結(jié)果

BMW

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

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

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

因為專一,所以專業(yè)嘛,這時候工廠方法就出現(xiàn)了。

二、工廠方法模式

工廠介面

#
//定義一個工廠接口,功能就是生產(chǎn)汽車
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());
???}
}

測試結(jié)果

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

三、抽象工廠模式

?抽象工廠

public?abstract?class?AbstractFactory?{

?????protected?abstract?Car?getCar();
?????
?????//這段代碼就是動態(tài)配置的功能
?????//固定模式的委派
?????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("這個產(chǎn)品產(chǎn)不出來");
????????????return?null;
????????}
????}
}

預(yù)設(shè)工廠

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());????????????
????}
}

測試結(jié)果

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

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

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

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

更多程式相關(guān)知識,請造訪:

程式設(shè)計課程! !

以上是java的三種工廠模式是什麼?的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔相應(yīng)的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點實現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存洩漏風險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對像被標記為垃圾。 2.基於標記-清除算法,標記所有可達對象,清除未標記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按後進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

如何使用Java中的觀察者模式? 如何使用Java中的觀察者模式? Aug 02, 2025 am 11:52 AM

該問題的明確答案是推薦使用自定義觀察者接口實現(xiàn)觀察者模式。 1.雖然Java提供了Observable和Observer,但前者是類且已棄用,缺乏靈活性;2.現(xiàn)代推薦做法是定義函數(shù)式Observer接口,由Subject維護Observer列表並在狀態(tài)變化時通知所有觀察者;3.可結(jié)合Lambda表達式使用,提升代碼簡潔性與可維護性;4.對於GUI或JavaBean場景,可選用PropertyChangeListener。因此,新項目應(yīng)採用自定義觀察者接口方案,它類型安全、易於測試且與現(xiàn)代Java特

See all articles