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

一捧搞、簡(jiǎn)單工廠模式

簡(jiǎn)單工廠的定義:提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能圾浅,而無須關(guān)心其具體實(shí)現(xiàn)腹尖。被創(chuàng)建實(shí)例的類型可以是接口柳恐、抽象類,也可以是具體的類

實(shí)現(xiàn)汽車接口

public interface Car {

? ? String getName();

}

奔馳類

public class Benz implements Car {

? ? @Override

? ? public String getName() {

? ? ? ? return "Benz";

? ? }

}

寶馬類

public class BMW implements Car {

? ? @Override

? ? public String getName() {

? ? ? ? return "BMW";

? ? }

}

簡(jiǎn)單工廠,既能生產(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("不好意思乐设,這個(gè)品牌的汽車生產(chǎn)不了");

? ? ? ? ? ? return null;

? ? ? ? }

? ? }

}

測(cè)試類

public class SimpleFactoryTest {

? ? public static void main(String[] args){

? ? ? ? SimpleFactory simpleFactory = new SimpleFactory();

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

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

? ? }

}

測(cè)試結(jié)果

BMW

根據(jù)簡(jiǎn)單工廠的定義讼庇,用戶只要產(chǎn)品而不在乎產(chǎn)品如何生產(chǎn),看起來好像很完美的樣子近尚。但大家想想巫俺,這個(gè)世界存在什么都生產(chǎn)的工廠嗎?

顯然是不存在的肿男,每一個(gè)汽車品牌都有自己的生產(chǎn)工廠介汹,都有自己生產(chǎn)技術(shù)。映射到spring框架中舶沛,我們有很多很多種的bean需要生產(chǎn)嘹承,如果只依靠一個(gè)簡(jiǎn)單工廠來實(shí)現(xiàn),那么我們得在工廠類中嵌套多少個(gè)if..else if叭缤ァ叹卷?

而且我們?cè)诖a中生產(chǎn)一輛汽車只是new一下就出來了,但實(shí)際操作中卻不知道需要進(jìn)行多少操作坪它,加載骤竹、注冊(cè)等操作都將體現(xiàn)在工廠類中,那么這個(gè)類就會(huì)變得紊亂往毡,管理起來也很不方便蒙揣,所以說每個(gè)品牌應(yīng)該有自己的生產(chǎn)類。

因?yàn)閷R豢t,所以專業(yè)嘛懒震,這個(gè)時(shí)候工廠方法就出現(xiàn)了。

二嗤详、工廠方法

工廠接口

//定義一個(gè)工廠接口个扰,功能就是生產(chǎn)汽車

public interface Factory {

? ? Car getCar();

}

奔馳工廠

public class BenzFactory implements Factory {

? ? @Override

? ? public Car getCar() {

? ? ? ? return new Benz();

? ? }

}

寶馬工廠

public class BMWFactory implements Factory{

? ? @Override

? ? public Car getCar() {

? ? ? ? return new BMW();

? ? }

}

測(cè)試類

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

? }

}

測(cè)試結(jié)果

BMW

Benz

根據(jù)上述代碼可以看出,不同品牌的汽車是由不同的工廠生產(chǎn)的葱色,貌似又是很完美的递宅。但大家看一下測(cè)試類,當(dāng)一個(gè)人想要去買一輛寶馬汽車的時(shí)候(假設(shè)沒有銷售商)苍狰,那么他就要去找寶馬工廠給他生產(chǎn)一輛办龄,過幾天又想要買一輛奔馳汽車的時(shí)候,又得跑到奔馳工廠請(qǐng)人生產(chǎn)舞痰,這無疑就增加了用戶的操作復(fù)雜性土榴。所以有沒有一種方便用戶操作的方法呢?這個(gè)時(shí)候抽象工廠模式就出現(xiàn)了响牛。

三玷禽、抽象工廠

?抽象工廠

public abstract class AbstractFactory {

? ? protected abstract Car getCar();


? ? //這段代碼就是動(dòng)態(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("這個(gè)產(chǎn)品產(chǎn)不出來");

? ? ? ? ? ? return null;

? ? ? ? }

? ? }

}

默認(rèn)工廠

public class DefaultFactory extends AbstractFactory {

? ? private AudiFactory defaultFactory = new AudiFactory();


? ? public Car getCar() {

? ? ? ? return defaultFactory.getCar();

? ? }

}

寶馬工廠

public class BMWFactory extends AbstractFactory {

? ? @Override

? ? public Car getCar() {

? ? ? ? return new BMW();

? ? }

}

奔馳工廠

public class BenzFactory extends AbstractFactory {

? ? @Override

? ? public Car getCar() {

? ? ? ? return new Benz();

? ? }

}

?測(cè)試類

public class AbstractFactoryTest {

? ? public static void main(String[] args) {? ? ? ?

? ? ? ? DefaultFactory factory = new DefaultFactory();? ? ? ?

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

? ? }

}

測(cè)試結(jié)果

Benz

根據(jù)上述代碼可以看出赫段,用戶需要一輛汽車,只需要去找默認(rèn)的工廠提出自己的需求(傳入?yún)?shù))矢赁,便能得到自己想要產(chǎn)品糯笙,而不用根據(jù)產(chǎn)品去尋找不同的生產(chǎn)工廠,方便用戶操作撩银。

注:對(duì)于設(shè)計(jì)模式给涕,有些人嗤之以鼻,有些人敬若神明额获,但我是認(rèn)可的够庙。

按我粗淺的理解,設(shè)計(jì)模式的經(jīng)典之處抄邀,就在于解決了編寫代碼的人和調(diào)用代碼的人雙方的痛楚耘眨,不同的設(shè)計(jì)模式也只適用于不同的場(chǎng)景。至于用或者不用境肾,如何使用剔难,那就需要各位看官著重考慮了。

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末环鲤,一起剝皮案震驚了整個(gè)濱河市纯趋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楔绞,老刑警劉巖结闸,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唇兑,死亡現(xiàn)場(chǎng)離奇詭異酒朵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)扎附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蔫耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人留夜,你說我怎么就攤上這事匙铡。” “怎么了碍粥?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我棍郎,道長(zhǎng)阅签,這世上最難降的妖魔是什么矿瘦? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮愿卒,結(jié)果婚禮上缚去,老公的妹妹穿的比我還像新娘。我一直安慰自己琼开,他們只是感情好易结,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柜候,像睡著了一般搞动。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渣刷,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天滋尉,我揣著相機(jī)與錄音,去河邊找鬼飞主。 笑死狮惜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碌识。 我是一名探鬼主播碾篡,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筏餐!你這毒婦竟也來了开泽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤魁瞪,失蹤者是張志新(化名)和其女友劉穎穆律,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體导俘,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峦耘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旅薄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辅髓。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖少梁,靈堂內(nèi)的尸體忽然破棺而出洛口,到底是詐尸還是另有隱情,我是刑警寧澤凯沪,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布第焰,位于F島的核電站,受9級(jí)特大地震影響妨马,放射性物質(zhì)發(fā)生泄漏挺举。R本人自食惡果不足惜而叼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豹悬。 院中可真熱鬧葵陵,春花似錦、人聲如沸瞻佛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伤柄。三九已至绊困,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間适刀,已是汗流浹背秤朗。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笔喉,地道東北人取视。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓作谭,卻偏偏與公主長(zhǎng)得像折欠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酱床,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)單工廠模式 簡(jiǎn)單工廠的定義:提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能汤纸,而無須關(guān)心其具體實(shí)現(xiàn)贮泞。被創(chuàng)建實(shí)例的類型可以是接口囊蓝、抽...
    Java架構(gòu)_師閱讀 404評(píng)論 0 0
  • 一珠叔、簡(jiǎn)單工廠模式 簡(jiǎn)單工廠的定義:提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能姥芥,而無須關(guān)心其具體實(shí)現(xiàn)凉唐。被創(chuàng)建實(shí)例的類型可以是接口、抽...
    墨雨軒夏閱讀 479評(píng)論 0 3
  • 一绘沉、簡(jiǎn)單工廠模式 簡(jiǎn)單工廠的定義:提供一個(gè)創(chuàng)建對(duì)象實(shí)例的功能择懂,而無須關(guān)心其具體實(shí)現(xiàn)困曙。被創(chuàng)建實(shí)例的類型可以是接口、抽...
    java高并發(fā)閱讀 668評(píng)論 0 16
  • 設(shè)計(jì)模式分類 總體來說設(shè)計(jì)模式分為三大類:創(chuàng)建型模式锄俄,共五種:工廠方法模式奶赠、抽象工廠模式鱼填、單例模式、建造者模式毅戈、原...
    lifeline丿毅閱讀 1,202評(píng)論 0 2
  • 一:概述 工廠模式的出現(xiàn)源于增加程序序的可擴(kuò)展性苹丸,降低耦合度。之所以叫做工廠模式竹祷,是用工廠生產(chǎn)產(chǎn)品來形象的比喻代碼...
    我未曾閱讀 308評(píng)論 0 5