工厂模式以及应用简单解释
一個(gè)jpa引發(fā)的血案,項(xiàng)目中應(yīng)用的jpa比較多,自己看了關(guān)于jpa相關(guān)的應(yīng)用,然后打算了解一些源碼,但是不太能看懂。想知道為什么在jpa中定義了方法,就能夠操作數(shù)據(jù)庫,不定義方法也能操作數(shù)據(jù)庫,資料上說應(yīng)用的代理設(shè)計(jì)模式,自己看過一些設(shè)計(jì)模式,但是并沒有太理解。自己又著重看了看代理設(shè)計(jì)模式,好像還是看不懂,然后跟身邊的一個(gè)大神,大學(xué)的好哥們交流,咨詢了一下,代理模式的實(shí)現(xiàn)原理。在學(xué)技術(shù)的時(shí)候我走入了一個(gè)誤區(qū),感覺想深入的學(xué)習(xí)某項(xiàng)技術(shù)就應(yīng)該了解源碼,了解源碼是沒有問題,但是我們應(yīng)該從宏觀的角度看待問題、了解問題。例如代理模式,我們應(yīng)用都會(huì)用,也都會(huì)去了解源碼,但是它是怎么實(shí)現(xiàn)代理的呢,我了解這個(gè)實(shí)現(xiàn)過程的時(shí)候就是直接去看底層的源碼,但是越看好像越迷糊,之所以這樣是因?yàn)槲覀儧]有站在正確的角度看待問題,如果我們知道代理模式是如何實(shí)現(xiàn)的,那么了解代理模式的原理就沒有那么費(fèi)勁了,雖然我看問題的角度可能對(duì)了,但是學(xué)藝不精,僅僅了解一些皮毛呀!我會(huì)在以后的博客中介紹代理模式的。
由jpa引起我的一些列要看的東西,反射->代理模式->工廠模式->反射的一系列應(yīng)用->JPA原理->AOP原理等,希望能全部更新成博客,所以可能最近多更新一些博客。
只有在用到某項(xiàng)的時(shí)候,細(xì)細(xì)琢磨才會(huì)發(fā)現(xiàn)一些其中的強(qiáng)大,希望大家多多進(jìn)步,如果有問題希望不吝賜教。
- 概述
- 簡單工廠模式
- 工廠模式
- 抽象工廠模式
概述
我暫時(shí)還沒有理解這個(gè)工廠模式的所有,只有在特定的場合下這個(gè)工廠模式的威力才能展現(xiàn)出來。工廠模式有三種基本形式,當(dāng)然實(shí)現(xiàn)的方式是多樣的,
顧名思義,工廠是生產(chǎn)衣服,零件之類的比較多,在這里工廠模式就一個(gè)作用,產(chǎn)生對(duì)象的。工廠里的產(chǎn)品就是具體的對(duì)象,產(chǎn)生對(duì)象的地方就是工廠,工廠模式屬于創(chuàng)建型設(shè)計(jì)模式。
下面篇幅我都用的定義:產(chǎn)品工廠->生產(chǎn)具體的產(chǎn)品、產(chǎn)品->具體的產(chǎn)品、產(chǎn)品抽象類->定義某一類產(chǎn)品的和產(chǎn)品工廠是不同的、抽象工廠->產(chǎn)生產(chǎn)品對(duì)象的工廠。
簡單工廠模式
- 場景介紹:首先定義產(chǎn)品抽象類Car、Boat,那么的產(chǎn)品類別就定了兩個(gè),如下的產(chǎn)品就屬于這兩個(gè)類別了,然后定義幾個(gè)具體的產(chǎn)品。抽象工廠類可以產(chǎn)品這兩類產(chǎn)品了(實(shí)際上這里并不是的類并不是抽象的,是一個(gè)實(shí)際的類用于產(chǎn)生具體的產(chǎn)品)
- UML展示類與類之間的關(guān)系:用網(wǎng)上的工具畫的,還挺好用的,我覺類圖有助于理解類與類之間的關(guān)系,遇到復(fù)雜的類,我覺得畫畫這個(gè)還是挺有用的。
-code:這里我只展示部分,我會(huì)把git地址留下。
public class StaticFactory {/*** CarFactory是一個(gè)靜態(tài)工廠類,初始化只有一個(gè)Benz類型的車* @return*/public Car getBenz(){return new Benz();}/*** 增加同種類型的車*/public Car getBwm(){return new Bwm();}/*** 工廠類中增加帶參數(shù)的不同種類的產(chǎn)品,只需要在工廠類中增加一條即可*/public Boat getBoat(String size){return new Yacht(size);}}//test類StaticFactory staticFactory = new StaticFactory();staticFactory.getBenz().type();- 用法:用一個(gè)類用來生成的對(duì)象,這個(gè)類就是工廠類,它的作用就是產(chǎn)生具體的產(chǎn)品對(duì)象,而每一個(gè)具體的產(chǎn)品對(duì)象,都會(huì)在工廠類中初始化,在工廠類中動(dòng)態(tài)的決定生成那個(gè)具體產(chǎn)品的對(duì)象。
- 增加與刪除產(chǎn)品時(shí):在工廠類中增加或者刪除對(duì)應(yīng)的產(chǎn)品的對(duì)象,增加的產(chǎn)品可以是一類產(chǎn)品,也可不是一類產(chǎn)品。
- 優(yōu)劣勢:
1)看著類圖就會(huì)感覺到,其實(shí)這個(gè)類與類之間的關(guān)系太復(fù)雜了,類的內(nèi)聚性太差了,當(dāng)某個(gè)具體的產(chǎn)品類發(fā)生改變時(shí),抽象工廠類也需要修改。
2)對(duì)于初始化對(duì)象來說確實(shí)還是比較方便的。
3)擴(kuò)展性也很好。 應(yīng)用介紹:在spring beanFactory中的應(yīng)用
在spring在xml中配置bean的相關(guān)信息,首先spring容器會(huì)讀取配置文件,將所有的bean初始成對(duì)應(yīng)的對(duì)象,并給每個(gè)對(duì)象起一個(gè)名字,然后存入到Map中,map是的鍵是類的名字,value是bean,這里的bean也就是要?jiǎng)?chuàng)建的具體的產(chǎn)品的對(duì)象,這里產(chǎn)品可以有多種,利用map.contain(“key”)方法獲取具體的產(chǎn)品的信息,這里產(chǎn)品可以有多種,利用map.contain(“key”)方法獲取具體的產(chǎn)品的信息。
工廠模式
場景介紹:(每一個(gè)模式我都會(huì)重新定義場景,有助于理解),定義一個(gè)產(chǎn)品抽象類Car、該類產(chǎn)品具體產(chǎn)品、具體的產(chǎn)品工廠類(一個(gè)產(chǎn)品對(duì)應(yīng)一個(gè)產(chǎn)品工廠類)、抽象工廠類(一類產(chǎn)品對(duì)應(yīng)一個(gè)抽象工廠)。
UML展示類與類之間的關(guān)系:
當(dāng)增加一類產(chǎn)品時(shí),就相當(dāng)于把這個(gè)圖重新畫一遍。開發(fā)的時(shí)候也是一樣的。
-code:
- 用法:同類產(chǎn)品存在同一個(gè)抽象類,每個(gè)具體的產(chǎn)品都存在生產(chǎn)該產(chǎn)品的工廠,該工廠用于初始化該產(chǎn)品的對(duì)象。抽象工廠類用于選擇那種產(chǎn)品的工廠。
- 增加或者刪除同類的產(chǎn)品時(shí):首先增加或者刪除一個(gè)具體的產(chǎn)品,然后增加或者刪除產(chǎn)品工廠。
- 增加不同類的產(chǎn)品時(shí):需要新增抽象工廠、產(chǎn)品抽象類、產(chǎn)品工廠、具體產(chǎn)品。ps:新增不同類型的好麻煩呀。
- 如果新的產(chǎn)品中增加參數(shù):也就是初始化對(duì)象的時(shí)候增加了構(gòu)造方法中需要入?yún)?。那么工廠方法就不太能用了,賊麻煩。
- 優(yōu)勢:
- 產(chǎn)品抽象,生產(chǎn)的產(chǎn)品也抽象,當(dāng)增加該類產(chǎn)品時(shí),只需增加具體的產(chǎn)品和生產(chǎn)該產(chǎn)品的工程即可
- 對(duì)于增減產(chǎn)品的操作比較方便,擴(kuò)展性比較好。
- 抽象工廠類之間的耦合性下降了,降低耦合性還是很有必要的。
抽象工廠模式
- 場景介紹:現(xiàn)在有兩種產(chǎn)品抽象類,幾個(gè)具體的產(chǎn)品,產(chǎn)品工廠,現(xiàn)在產(chǎn)品工廠強(qiáng)大了,能夠生產(chǎn)兩種產(chǎn)品了,抽象工廠也是一樣,能夠生產(chǎn)兩種產(chǎn)品了。
- UML展示類與類之間的關(guān)系:
- code:
- 抽象工廠模式和工廠方法模式之間的區(qū)別:從幾個(gè)方面
1)產(chǎn)品抽象類和具體產(chǎn)品(沒區(qū)別):需要增加一個(gè)產(chǎn)品抽象類和具體的產(chǎn)品。
2)產(chǎn)品工廠:可以產(chǎn)生多個(gè)產(chǎn)品。
3)抽象工廠:增加一個(gè)類別的產(chǎn)品不需要額外的增加抽象工廠,但是增加一個(gè)類產(chǎn)品時(shí),其他的不需要的類也可能增加這個(gè)產(chǎn)品類別。
其實(shí)看起來工廠模式?jīng)]有什么東西,也容易理解,我在這里舉的例子也可能不太恰當(dāng),像這種設(shè)計(jì)模式只有在特定的情況下才能發(fā)揮其優(yōu)勢的,雖然可能并沒有體會(huì)它的深意,也要理解它。
git 地址:
https://github.com/jtracydy/SpringBootTestDemo/tree/master/src/main/java/com/demo/d/factory/own
參考博客:
http://blog.csdn.net/zxt0601/article/details/52798423
http://blog.csdn.net/zxt0601/article/details/52798423
作圖工具地址 :https://www.processon.com/
UML圖參考博客:http://blog.csdn.net/jtracydy/article/details/78980315
總結(jié)
以上是生活随笔為你收集整理的工厂模式以及应用简单解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSP-28027笔记
- 下一篇: scrapy框架学习(三)Spiders