java bean 工廠模式_深入理解Java的三種工廠模式

一、簡單工廠模式

簡單工廠的定義:提供一個創建對象實例的功能,而無須關心其具體實現。被創建實例的類型可以是接口、抽象類,也可以是具體的類

實現汽車接口

public interfaceCar {

String getName();

}

奔馳類

public class Benz implementsCar {

@OverridepublicString getName() {return "Benz";

}

}

寶馬類

public class BMW implementsCar {

@OverridepublicString getName() {return "BMW";

}

}

簡單工廠,既能生產寶馬又能生產奔馳

public classSimpleFactory {publicCar getCar(String name){if (name.equals("BMW")){return newBMW();

}else if (name.equals("benz")){return newBenz();

}else{

System.out.println("不好意思,這個品牌的汽車生產不了");return null;

}

}

}

測試類

public classSimpleFactoryTest {public static voidmain(String[] args){

SimpleFactory simpleFactory= newSimpleFactory();

Car car= simpleFactory.getCar("BMW");

System.out.println(car.getName());

}

}

測試結果

BMW

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

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

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

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

二、工廠方法

工廠接口

//定義一個工廠接口,功能就是生產汽車

public interfaceFactory {

Car getCar();

}

奔馳工廠

public class BenzFactory implementsFactory {

@OverridepublicCar getCar() {return newBenz();

}

}

寶馬工廠

public class BMWFactory implementsFactory{

@OverridepublicCar getCar() {return newBMW();

}

}

測試類

public classFactoryTest {public static voidmain(String[] args){

Factory bmwFactory= newBMWFactory();

System.out.println(bmwFactory.getCar().getName());

Factory benzFactory= newBenzFactory();

System.out.println(benzFactory.getCar().getName());

}

}

測試結果

BMW

Benz

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

三、抽象工廠

抽象工廠

public abstract classAbstractFactory {protected abstractCar getCar();//這段代碼就是動態配置的功能//固定模式的委派

publicCar getCar(String name){if("BMW".equalsIgnoreCase(name)){return newBmwFactory().getCar();

}else if("Benz".equalsIgnoreCase(name)){return newBenzFactory().getCar();

}else if("Audi".equalsIgnoreCase(name)){return newAudiFactory().getCar();

}else{

System.out.println("這個產品產不出來");return null;

}

}

}

默認工廠

public class DefaultFactory extendsAbstractFactory {private AudiFactory defaultFactory = newAudiFactory();publicCar getCar() {returndefaultFactory.getCar();

}

}

寶馬工廠

public class BMWFactory extendsAbstractFactory {

@OverridepublicCar getCar() {return newBMW();

}

}

奔馳工廠

public class BenzFactory extendsAbstractFactory {

@OverridepublicCar getCar() {return newBenz();

}

}

測試類

public classAbstractFactoryTest {public static voidmain(String[] args) {

DefaultFactory factory= newDefaultFactory();

System.out.println(factory.getCar("Benz").getName());

}

}

測試結果

Benz

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

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

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277487.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277487.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277487.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java windows 取所有任務_Win下,通過Jstack截取Java進程中的堆棧信息

在Java軟件的使用過程中,有時會莫名的出現奇怪的問題。而這些問題常常無法使用日志信息定位,這時我們就需要通過查看進程內部線程的堆棧調用關系來分析問題出在哪里。舉個例子,當我們在做某個操作時,莫名的會彈出多個警告框&#…

docker mysql Exit 1

用laradock啟動mysql時,state總是 Exit 1 ,docker-compose build后也沒有效果 這時應該在~/.laradock/data(.env的DATA_PATH_HOST路徑)下,把mysql的數據文件刪除 這種情況常見于mysql安裝多版本&#xff0c…

redis基礎一_常用指令

# Redis configuration file example. # # Note that in order to read the configuration file, Redis must be # started with the file path as first argument: #./redis-server /path/to/redis.conf docker啟動redis: docker run -d -p 6379:6379 -v /home/anmin/Desktop/…

滴滴Booster移動APP質量優化框架 學習之旅 三

推薦閱讀: 滴滴Booster移動App質量優化框架-學習之旅 一 Android 模塊Api化演練 不一樣視角的Glide剖析(一) 滴滴Booster移動App質量優化框架-學習之旅 二對重復資源優化和無用資源優化進行了討論。這里對不可編譯無用assets資源優化進行討論。 先看微信Matrix-ApkC…

java 最后的異常_java – 最后不要拋出堆棧溢出異常

Error不是例外.所以捕捉任何異常都不會捕獲StackOverflowError.所以讓我們先來看一下“明顯的錯誤” – (這段代碼不太適合這個答案后面的說明):catch(Throwable e){System.out.println("Catch");}如果您進行此更改,您將發現代碼仍然不打印.但是它不會打印…

Colder框架硬核更新(Sharding+IOC)

目錄 引言控制反轉讀寫分離分庫分表 理論基礎設計目標現狀調研設計思路實現之過五關斬六將 動態對象動態模型緩存數據源移植查詢表達式樹深度移植數據合并算法事務支持實際使用展望未來引言 前方硬核警告:全文干貨11000字,請耐心閱讀 遙想去年這個時候&a…

python:小心類實例的屬性動態綁定機制

為什么80%的碼農都做不了架構師?>>> class Test:def __init__(self):self.__keyinitdef get_key(self):return self.__keydef set_key(self,key):self.__keykeyif __name__ __main__:obj Test()print(obj.get_key())#輸出初始值initobj.set_key(通過s…

java 獲取手機歸屬地_java 獲取手機歸屬地

java 獲取手機歸屬地[2021-01-30 20:46:44] 簡介:php去除nbsp的方法:首先創建一個PHP代碼示例文件;然后通過“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推薦:…

Atom常用功能插件

minimap代碼縮略圖插件 代碼粒子效果activate-power-mode 代碼格式化插件atom-beautify packages-->Atom Beautify-->Beautify進行格式化 標簽折疊 autoclose-html 轉載于:https://www.cnblogs.com/chenxi-hxl/p/9464120.html

mui aniShow 動畫屬性

aniShow: animationType //mui切換窗口的動畫效果;(默認為slide-in-right);1."auto": (String 類型 )自動選擇動畫效果,使用上次顯示窗口設置的動畫效果,如果是第一次顯示則默認動畫效果。 2.&qu…

java中和char功能相反的是_JAVA基礎語法

java的基礎語法Java中的程序可分為結構定義語句和功能執行語句.結構定義語句:用于聲明一個類或方法,功能執行語句用于實現具體的功能。功能執行語句:每條功能執行語句的結尾都必須用英文分號(;)結束。public修飾的類名必須和文件名一致(如果沒…

P1357 花園 (矩陣快速冪+ DP)

題意:一個只含字母C和P的環形串 求長度為n且每m個連續字符不含有超過k個C的方案數 m < 5 n < 1e15 題解:用一個m位二進制表示狀態 轉移很好想 但是這個題是用矩陣快速冪加速dp的 因為每一位的轉移都是一樣的 用一個矩陣表示狀態i能否轉移到狀態j 然后跑一遍 統計答案特…

IDEA設置類、方法注釋模板

類注釋模板 File -> Other Setting -> Default Setting打開默認設置 Editor -> File and Code Templates -> Files -> Class 找到類注釋模板&#xff0c;在public class前面添加模板注釋 /** * program: ${PROJECT_NAME}->${NAME} * description: ${descript…

Element.shadowRoot

Element.shadowRoot轉載于:https://www.cnblogs.com/yishenweilv/p/11083278.html

netty源碼分析之服務端啟動全解析

background netty 是一個異步事件驅動的網絡通信層框架&#xff0c;其官方文檔的解釋為 Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and stream…

捕魚達人java源代碼解析_捕魚達人源碼Java

【實例簡介】捕魚達人源碼Java實現的完整代碼,對應的源碼分析文章http://write.blog.csdn.net/postedit【實例截圖】【核心代碼】Fishlord├── bin│ ├── fishlord│ │ ├── Fish.class│ │ ├── Fishlord.class│ │ ├── Net.class│ │ ├─…

Android-一張圖理解MVP的用法

M和V通過P交互&#xff0c;M做了兩件事&#xff0c;開啟子線程做耗時操作&#xff0c;然后使用原生的Hander方式切回主線程回調結果給P。 M做的兩件事也可以使用比較流行的rxjava實現&#xff1a; 備注&#xff1a;圖片不清晰可以看這里 轉載于:https://www.cnblogs.com/develo…

Android 使用jtds遠程訪問數據庫

最近老師讓我用jtds這個jar包遠程訪問數據庫中的數據&#xff0c;雖然不難&#xff0c;但有幾個點還是要注意一下的。 1、jtds的jar包我使用的是1.2.7這個版本的&#xff0c;如果是Java工程使用的是1.3.1這個版本&#xff0c;Android工程不能使用1.3.1否則連接不上數據庫 2、遠…

java乘以2的位計算符號_java編程之:按位與運算,等運算規則

按位與運算符(&)參加運算的兩個數據&#xff0c;按二進制位進行“與”運算。運算規則&#xff1a;0&00; 0&10; 1&00; 1&11;即&#xff1a;兩位同時為“1”&#xff0c;結果才為“1”&#xff0c;否則為0例如&#xff1a;3&5 即 0000 0011 &a…

C語言文字加密程序的實現

前言&#xff1a;當今社會是一個信息社會&#xff0c;你的個人信息和聊天記錄極有可能被別有用心的人時時刻刻監視著&#xff0c;那么你想不想實現專屬于兩個人或一個小圈子的人在社交軟件上的交流不被任何其他人讀懂呢&#xff1f;下面就給大家提供一個原理極其簡單程序極其容…