作為一個(gè)新手,開(kāi)始聽(tīng)到設(shè)計(jì)模式的時(shí)候是蒙蔽的泄鹏,什么?編程居然還能被歸類(lèi)成方法秧耗?還只被歸納成了23種备籽?這么少就可以解決那么多問(wèn)題么?
于是我開(kāi)始接觸了設(shè)計(jì)模式·····
從開(kāi)始的單例模式到工廠模式,單例模式還是很簡(jiǎn)單车猬,還挺好理解霉猛,但到工廠模式就感覺(jué)有了一些難度,等到了抽象工廠模式珠闰,感覺(jué)懵逼+1惜浅,不過(guò)還好我們之前有很多巨人,我看到一篇文章伏嗜,講了一種叫做簡(jiǎn)單工廠模式的東西坛悉,感覺(jué)對(duì)工廠模式理解加深了一些,我會(huì)以我理解的方式闡述一下簡(jiǎn)單工廠模式承绸,原文鏈接我會(huì)附在文章末尾裸影。
首先,如果你想開(kāi)發(fā)一套圖表庫(kù)军熏,該圖表庫(kù)可以為應(yīng)用系統(tǒng)提供各種不同外觀的圖表轩猩,例如柱狀圖、餅狀圖荡澎、折線圖等均践。圖表庫(kù)設(shè)計(jì)人員希望為應(yīng)用系統(tǒng)開(kāi)發(fā)人員提供一套靈活易用的圖表庫(kù),而且可以較為方便地對(duì)圖表庫(kù)進(jìn)行擴(kuò)展衔瓮,以便能夠在將來(lái)增加一些新類(lèi)型的圖表。(如果你不知道工廠模式抖甘,很懵逼) 設(shè)計(jì)人員提出了一個(gè)這樣一個(gè)初始設(shè)計(jì)方案
客戶端代碼通過(guò)調(diào)用Chart類(lèi)的構(gòu)造函數(shù)來(lái)創(chuàng)建圖表對(duì)象热鞍,根據(jù)參數(shù)type的不同可以得到不同類(lèi)型的圖表,然后再調(diào)用display()方法來(lái)顯示相應(yīng)的圖表衔彻。
不難看出薇宠,Chart類(lèi)是一個(gè)“巨大的”類(lèi),在該類(lèi)的設(shè)計(jì)中存在如下幾個(gè)問(wèn)題:
(1)代碼if else過(guò)多艰额,代碼過(guò)長(zhǎng)澄港,相應(yīng)不適合閱讀,維護(hù)柄沮,測(cè)試回梧。而且條件語(yǔ)句影響代碼性能
(2)當(dāng)需要增加新類(lèi)型的圖表時(shí),必須修改Chart類(lèi)的源代碼祖搓,違反了“開(kāi)閉原則”狱意。
(3)客戶端只能通過(guò)new關(guān)鍵字來(lái)直接創(chuàng)建Chart對(duì)象,Chart類(lèi)與客戶端類(lèi)耦合度較高拯欧,對(duì)象的創(chuàng)建和使用無(wú)法分離详囤。
當(dāng)然 還有一些問(wèn)題,但是我沒(méi)太理解镐作,我也就沒(méi)寫(xiě)藏姐,這篇文章我也是寫(xiě)給剛?cè)腴T(mén)的新手(老手請(qǐng)直接翻到文章末尾看那個(gè)我看了很久的原文)
而簡(jiǎn)單工廠模式怎么解決這些問(wèn)題的呢隆箩?
他目的就是:當(dāng)你需要什么,只需要傳入一個(gè)正確的參數(shù)羔杨,就可以獲取你所需要的對(duì)象捌臊,而無(wú)須知道其創(chuàng)建細(xì)節(jié)
** Factory(工廠角色):**工廠角色即工廠類(lèi),它是簡(jiǎn)單工廠模式的核心问畅,負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有產(chǎn)品實(shí)例的內(nèi)部邏輯娃属;工廠類(lèi)可以被外界直接調(diào)用真慢,創(chuàng)建所需的產(chǎn)品對(duì)象缨睡;在工廠類(lèi)中提供了靜態(tài)的工廠方法factoryMethod(),它的返回類(lèi)型為抽象產(chǎn)品類(lèi)型Product携冤。
Product(抽象產(chǎn)品角色):它是工廠類(lèi)所創(chuàng)建的所有對(duì)象的父類(lèi)卵皂,封裝了各種產(chǎn)品對(duì)象的公有方法秩铆,它的引入將提高系統(tǒng)的靈活性,使得在工廠類(lèi)中只需定義一個(gè)通用的工廠方法灯变,因?yàn)樗袆?chuàng)建的具體產(chǎn)品對(duì)象都是其子類(lèi)對(duì)象殴玛。
ConcreteProduct(具體產(chǎn)品角色):它是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有被創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類(lèi)的實(shí)例添祸。每一個(gè)具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色滚粟,需要實(shí)現(xiàn)在抽象產(chǎn)品中聲明的抽象方法。
在簡(jiǎn)單工廠模式中刃泌,客戶端可以通過(guò)工廠類(lèi)來(lái)創(chuàng)建一個(gè)產(chǎn)品類(lèi)的實(shí)例凡壤,而無(wú)須直接使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象
在使用簡(jiǎn)單工廠模式時(shí),首先需要對(duì)產(chǎn)品類(lèi)進(jìn)行重構(gòu)耙替,一般我們不能設(shè)計(jì)一個(gè)包羅萬(wàn)象的產(chǎn)品類(lèi)亚侠,所以我們需根據(jù)實(shí)際情況設(shè)計(jì)一個(gè)產(chǎn)品層次結(jié)構(gòu),將所有產(chǎn)品類(lèi)公共的代碼移至抽象產(chǎn)品類(lèi)俗扇,并在抽象產(chǎn)品類(lèi)中聲明一些抽象方法硝烂,以供不同的具體產(chǎn)品類(lèi)來(lái)實(shí)現(xiàn),典型的抽象產(chǎn)品類(lèi)代碼如下所示
在具體產(chǎn)品類(lèi)中實(shí)現(xiàn)了抽象產(chǎn)品類(lèi)中聲明的抽象業(yè)務(wù)方法铜幽,不同的具體產(chǎn)品類(lèi)可以提供不同的實(shí)現(xiàn)滞谢,典型的具體產(chǎn)品類(lèi)代碼如下所示
接下來(lái)這一步就是工廠模式完成這項(xiàng)功能的核心部分:
簡(jiǎn)單工廠模式的核心是工廠類(lèi),在沒(méi)有工廠類(lèi)之前除抛,客戶端一般會(huì)使用new關(guān)鍵字來(lái)直接創(chuàng)建產(chǎn)品對(duì)象爹凹,而在引入工廠類(lèi)之后,客戶端可以通過(guò)工廠類(lèi)來(lái)創(chuàng)建產(chǎn)品镶殷,在簡(jiǎn)單工廠模式中禾酱,工廠類(lèi)提供了一個(gè)靜態(tài)工廠方法供客戶端使用,根據(jù)所傳入的參數(shù)不同可以創(chuàng)建不同的產(chǎn)品對(duì)象,典型的工廠類(lèi)代碼如下所示:
在客戶端代碼中颤陶,我們通過(guò)調(diào)用工廠類(lèi)的工廠方法即可得到產(chǎn)品對(duì)象颗管,典型代碼如下所示:
而接下來(lái)就是用簡(jiǎn)單工廠模式解決這個(gè)問(wèn)題的重構(gòu)后的結(jié)構(gòu)了
在圖2中,Chart接口充當(dāng)抽象產(chǎn)品類(lèi)滓走,其子類(lèi)HistogramChart垦江、PieChart和LineChart充當(dāng)具體產(chǎn)品類(lèi),ChartFactory充當(dāng)工廠類(lèi)搅方。完整代碼如下所示:
編寫(xiě)如下客戶端測(cè)試代碼:
創(chuàng)建柱狀圖比吭!
初始化設(shè)置柱狀圖!
顯示柱狀圖姨涡!
在客戶端測(cè)試類(lèi)中衩藤,我們使用工廠類(lèi)的靜態(tài)工廠方法創(chuàng)建產(chǎn)品對(duì)象,如果需要更換產(chǎn)品涛漂,只需修改靜態(tài)工廠方法中的參數(shù)即可赏表,例如將柱狀圖改為餅狀圖,只需將代碼:
chart = ChartFactory.getChart("histogram");
改為:
chart = ChartFactory.getChart("pie");
編譯并運(yùn)行程序匈仗,輸出結(jié)果如下:
創(chuàng)建餅狀圖瓢剿!
初始化設(shè)置餅狀圖!
顯示餅狀圖悠轩!
成功了<淇瘛!火架!
當(dāng)然這個(gè)設(shè)計(jì)還是有一些不足鉴象,既然我們知道有不足 我當(dāng)然會(huì)接把它解決
不過(guò)方法是在下篇文章講給大家·······
這是原文鏈接簡(jiǎn)單工廠模式
我會(huì)持續(xù)的把我對(duì)設(shè)計(jì)模式的翻譯與理解寫(xiě)給大家,希望大家喜歡距潘。炼列。只搁。新手上路請(qǐng)多關(guān)照