簡(jiǎn)單工廠模式(上)

作為一個(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ì)方案
image
  客戶端代碼通過(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é)

image

** 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)代碼如下所示

image

在具體產(chǎn)品類(lèi)中實(shí)現(xiàn)了抽象產(chǎn)品類(lèi)中聲明的抽象業(yè)務(wù)方法铜幽,不同的具體產(chǎn)品類(lèi)可以提供不同的實(shí)現(xiàn)滞谢,典型的具體產(chǎn)品類(lèi)代碼如下所示

image

接下來(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)代碼如下所示:

image

在客戶端代碼中颤陶,我們通過(guò)調(diào)用工廠類(lèi)的工廠方法即可得到產(chǎn)品對(duì)象颗管,典型代碼如下所示:

image

而接下來(lái)就是用簡(jiǎn)單工廠模式解決這個(gè)問(wèn)題的重構(gòu)后的結(jié)構(gòu)了

image

在圖2中,Chart接口充當(dāng)抽象產(chǎn)品類(lèi)滓走,其子類(lèi)HistogramChart垦江、PieChart和LineChart充當(dāng)具體產(chǎn)品類(lèi),ChartFactory充當(dāng)工廠類(lèi)搅方。完整代碼如下所示:

image
image

編寫(xiě)如下客戶端測(cè)試代碼:

image

創(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)照

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末音比,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子氢惋,更是在濱河造成了極大的恐慌洞翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件焰望,死亡現(xiàn)場(chǎng)離奇詭異骚亿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)熊赖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)来屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事俱笛±” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵迎膜,是天一觀的道長(zhǎng)泥技。 經(jīng)常有香客問(wèn)我,道長(zhǎng)磕仅,這世上最難降的妖魔是什么珊豹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮榕订,結(jié)果婚禮上店茶,老公的妹妹穿的比我還像新娘。我一直安慰自己卸亮,他們只是感情好忽妒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著兼贸,像睡著了一般段直。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溶诞,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天鸯檬,我揣著相機(jī)與錄音,去河邊找鬼螺垢。 笑死喧务,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枉圃。 我是一名探鬼主播功茴,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼孽亲!你這毒婦竟也來(lái)了坎穿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤返劲,失蹤者是張志新(化名)和其女友劉穎玲昧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篮绿,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孵延,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亲配。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尘应。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惶凝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犬钢,到底是詐尸還是另有隱情梨睁,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布娜饵,位于F島的核電站坡贺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏箱舞。R本人自食惡果不足惜遍坟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晴股。 院中可真熱鬧愿伴,春花似錦、人聲如沸电湘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寂呛。三九已至怎诫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贷痪,已是汗流浹背幻妓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劫拢,地道東北人肉津。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舱沧,于是被迫代替她去往敵國(guó)和親妹沙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 工廠模式是最常用的一類(lèi)創(chuàng)建型設(shè)計(jì)模式熟吏,通常我們所說(shuō)的工廠模式是指工廠方法模式距糖,它也是使用頻率最高的工廠模式。本章將...
    justCode_閱讀 852評(píng)論 0 3
  • 創(chuàng)建型設(shè)計(jì)模式: 簡(jiǎn)單工廠模式分俯、工廠方法模式肾筐、抽象工廠模式哆料、單例模式缸剪、原型模式和建造者模式。 統(tǒng)共六種东亦。 本此分享...
    markfork閱讀 422評(píng)論 0 2
  • 設(shè)計(jì)模式匯總 一杏节、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用唬渗、多...
    MinoyJet閱讀 3,939評(píng)論 1 15
  • 1 場(chǎng)景問(wèn)題# 1.1 導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 考慮這樣一個(gè)實(shí)際應(yīng)用:實(shí)現(xiàn)一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架,來(lái)讓客戶選擇數(shù)據(jù)...
    七寸知架構(gòu)閱讀 6,660評(píng)論 6 75
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法奋渔,類(lèi)相關(guān)的語(yǔ)法镊逝,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法嫉鲸,異常的語(yǔ)法撑蒜,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,630評(píng)論 18 399