java項(xiàng)目模式有哪些類(lèi)型-Java中幾種常見(jiàn)的設(shè)計(jì)模式-工廠設(shè)計(jì)模式_第1頁(yè)
java項(xiàng)目模式有哪些類(lèi)型-Java中幾種常見(jiàn)的設(shè)計(jì)模式-工廠設(shè)計(jì)模式_第2頁(yè)
java項(xiàng)目模式有哪些類(lèi)型-Java中幾種常見(jiàn)的設(shè)計(jì)模式-工廠設(shè)計(jì)模式_第3頁(yè)
java項(xiàng)目模式有哪些類(lèi)型-Java中幾種常見(jiàn)的設(shè)計(jì)模式-工廠設(shè)計(jì)模式_第4頁(yè)
java項(xiàng)目模式有哪些類(lèi)型-Java中幾種常見(jiàn)的設(shè)計(jì)模式-工廠設(shè)計(jì)模式_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

java項(xiàng)?模式有哪些類(lèi)型_Java中?種常見(jiàn)的設(shè)計(jì)模式--??設(shè)計(jì)模式?、什么是??設(shè)計(jì)模式當(dāng)需要獲取對(duì)象時(shí),并不是直接去實(shí)例化,?是通過(guò)?個(gè)??類(lèi)間接獲取,以實(shí)現(xiàn)創(chuàng)建者和調(diào)?者的分離,實(shí)現(xiàn)更好的解耦。直??點(diǎn)說(shuō),就是調(diào)?者不?也根本不會(huì)知道對(duì)象時(shí)如何創(chuàng)建的,它只需要??提出條件即可,由??來(lái)根據(jù)提交創(chuàng)建具體的實(shí)例。?、使?場(chǎng)景當(dāng)框架需要深度解耦,?度可擴(kuò)展時(shí)就需要?到??設(shè)計(jì)模式,這種設(shè)計(jì)模式在SpringBoot、Mybatis框架中很常見(jiàn)。三、?種類(lèi)型如果詳細(xì)劃分,??設(shè)計(jì)模式可細(xì)分為:簡(jiǎn)單??模式(靜態(tài)??模式)???法模式抽象??模式接下來(lái),我們將?個(gè)?個(gè)詳細(xì)講解。再此之前,有?個(gè)?向?qū)ο笤O(shè)計(jì)的基本原則,理解這些原則可以幫助我們更好地理解??設(shè)計(jì)模式。OCP(開(kāi)閉原則,Open-Close-Principle):?個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。DIP(依賴(lài)倒置原則,DependenceInvisionPrinciple):要針對(duì)接?編程,不要針對(duì)實(shí)現(xiàn)編程。LoD(迪?特法則,LawofDemeter):只與你的朋友通信,?避免與陌??通信。四、簡(jiǎn)單??模式舉個(gè)例?,假如我們?cè)谧?個(gè)?戶(hù)注冊(cè)功能,再Dao中提供注冊(cè)服務(wù),?戶(hù)信息的實(shí)體類(lèi)如下:publicclassUser{publicStringname;publicStringpassword;publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}}我們打算把新注冊(cè)的?戶(hù)信息插?到數(shù)據(jù)庫(kù),假設(shè)我們?前使?的數(shù)據(jù)庫(kù)是Mysql,我們的Dao接?和實(shí)現(xiàn)類(lèi)分別如下:publicinterfaceDaoRegisterService{voidinsert(Useruser);}publicclassDaoMysqlRegisterServiceImplimplementsDaoRegisterService{@Overridepublicvoidinsert(Useruser){System.out.print("注冊(cè)?戶(hù):"++"到Mysql數(shù)據(jù)庫(kù)成功");}}在客戶(hù)端調(diào)?結(jié)果如下:publicclassClient{publicstaticvoidmain(String[]args){

Useruser=newUser();="張三";user.password="123456";DaoRegisterServiceregisterService=newDaoMysqlRegisterServiceImpl();registerService.insert(user);}}結(jié)果:注冊(cè)?戶(hù):張三到Mysql數(shù)據(jù)庫(kù)成功現(xiàn)在這種做法完全可以滿(mǎn)?我們的使?要求,但隨著業(yè)務(wù)量的增加,Mysql數(shù)據(jù)庫(kù)越發(fā)不能滿(mǎn)?我們的業(yè)務(wù)需要,我們需要使?性能更好的Oracle數(shù)據(jù)庫(kù),于是我們需要再寫(xiě)?個(gè)Oracle的Dao服務(wù)實(shí)現(xiàn)類(lèi)。publicclassDaoOracleRegisterServiceImplimplementsDaoRegisterService{@Overridepublicvoidinsert(Useruser){System.out.print("注冊(cè)?戶(hù):"++"到Oracle數(shù)據(jù)庫(kù)成功");}}我們的客戶(hù)端也需要進(jìn)?對(duì)應(yīng)的更改。publicclassClient{publicstaticvoidmain(String[]args){Useruser=newUser();="張三";user.password="123456";DaoRegisterServiceregisterService=newDaoOracleRegisterServiceImpl();registerService.insert(user);}}結(jié)果:注冊(cè)?戶(hù):張三到Oracle數(shù)據(jù)庫(kù)成功項(xiàng)??如果只有?處需要將DaoMysqlRegisterServiceImpl類(lèi)改為DaoOracleRegisterServiceImpl的地?還好,如果有??處、??處,那么這個(gè)修改?作顯然出?不討好。那如何解決這個(gè)問(wèn)題呢,讓程序框架更容易實(shí)現(xiàn)擴(kuò)展功能,這個(gè)時(shí)候我們就需要?到??設(shè)計(jì)模式。?先我們創(chuàng)建?個(gè)??類(lèi),??有個(gè)靜態(tài)?法,通過(guò)數(shù)據(jù)名稱(chēng)可為我們提供DaoRegisterService實(shí)例。publicclassDaoFactory{publicstaticDaoRegisterServicecreateDaoRegisterService(StringdatabaseName){switch(databaseName){case"mysql":returnnewDaoMysqlRegisterServicelImpl();case"oracle":returnnewDaoOracleRegisterServiceImpl();default:returnnull;}}

}在客戶(hù)端,我們只需要向??輸?條件,就可以得到我們想要的對(duì)象實(shí)例,?不需要??去創(chuàng)建。publicclassClient{publicstaticvoidmain(String[]args){Useruser=newUser();="張三";user.password="123456";//項(xiàng)?初期//DaoServiceService=DaoFactory.createDaoRegisterService("mysql");//Service.insert(user);//項(xiàng)?拓展期DaoServiceService=DaoFactory.createDaoRegisterService("oracle");Service.insert(user);}}現(xiàn)在我們來(lái)看看這種簡(jiǎn)單??模式的優(yōu)缺點(diǎn),優(yōu)點(diǎn)是它很簡(jiǎn)單,也確實(shí)能實(shí)現(xiàn)??模式的功能,即調(diào)?者和創(chuàng)建者實(shí)現(xiàn)解耦。當(dāng)同時(shí)這種簡(jiǎn)單??模式也存在卻缺點(diǎn),現(xiàn)在我們只有兩個(gè)?標(biāo)(DaoMysqlRegisterServiceImpl和DaoOracleRegisterServiceImpl服務(wù)),當(dāng)我們?標(biāo)增多時(shí)(?如增加?個(gè)DaoDB2RegisterServiceImpl),我們就需要更改??類(lèi)的內(nèi)部代碼,使其兼容新的內(nèi)容,這明顯違背了我們上?講的開(kāi)閉原則,即寧愿增加新的類(lèi)來(lái)擴(kuò)展,也不要對(duì)原來(lái)的類(lèi)做修改,所以出現(xiàn)了???法模式。五、???法模式???法模式是對(duì)簡(jiǎn)單??模式的抽象升級(jí),將??這個(gè)概念抽象出來(lái)成為接?,然后針對(duì)每種?標(biāo)實(shí)現(xiàn)類(lèi)創(chuàng)建?個(gè)??實(shí)現(xiàn),?對(duì)?來(lái)實(shí)現(xiàn),當(dāng)新增了?標(biāo)實(shí)現(xiàn),只要同時(shí)新增?個(gè)??實(shí)現(xiàn)即可。同樣還是上?數(shù)據(jù)庫(kù)的例?,我們對(duì)??類(lèi)升級(jí)未接?,然后對(duì)每?個(gè)?標(biāo)創(chuàng)建?個(gè)??接?的實(shí)現(xiàn),當(dāng)有新的?標(biāo)出現(xiàn)時(shí),只需要再增加對(duì)應(yīng)的??接?實(shí)現(xiàn),?不需要對(duì)原來(lái)的代碼做任何的修改。??接?:publicinterfaceDaoFactory{DaoRegisterServicecreateDaoRegisterService();}mysql的??實(shí)現(xiàn)類(lèi):publicclassDaoMysqlFactoryimplementsDaoFactory{@OverridepublicDaoRegisterServicecreateDaoRegisterService(){returnnewDaoMysqlRegisterServiceImpl();}}oracle的??實(shí)現(xiàn)類(lèi):publicclassDaoOracleFactoryimplementsDaoFactory{@OverridepublicDaoRegisterServicecreateDaoRegisterService(){returnnewDaoOracleRegisterServiceImpl();}}客戶(hù)端:publicclassClient{publicstaticvoidmain(String[]args){

Useruser=newUser();="張三";user.password="123456";//項(xiàng)?初期//DaoFactorydaoFactory=newDaoMysqlFactory();//DaoRegisterServiceregisterService=daoFactory.createDaoRegisterService();//registerService.insert(user);DaoFactorydaoFactory=newDaoOracleFactory();DaoRegisterServiceregisterService=daoFactory.createDaoRegisterService();registerService.insert(user);}}當(dāng)項(xiàng)?需要再拓展?個(gè)DB2的服務(wù)時(shí),只需要再增加?個(gè)DB2的Dao實(shí)現(xiàn)類(lèi)和?個(gè)??實(shí)現(xiàn)類(lèi)即可。再說(shuō)說(shuō)???法模式的優(yōu)缺點(diǎn)以及使?場(chǎng)景優(yōu)點(diǎn):?戶(hù)只需關(guān)?所需產(chǎn)品對(duì)應(yīng)的??,?須關(guān)?創(chuàng)建細(xì)節(jié)(屏蔽產(chǎn)品類(lèi)),甚?不需要知道具體產(chǎn)品的類(lèi)名;典型的解耦框架,?層模塊需要知道產(chǎn)品的抽象類(lèi),其他的實(shí)現(xiàn)類(lèi)都不?關(guān)?;良好的封裝性,代碼結(jié)構(gòu)清晰,優(yōu)秀的擴(kuò)展性,同時(shí)符合開(kāi)閉原則。缺點(diǎn):在添加新產(chǎn)品時(shí)成對(duì)增加了類(lèi)的個(gè)數(shù),增加了系統(tǒng)的復(fù)雜度,編譯和運(yùn)?更多的類(lèi)也會(huì)增加系統(tǒng)的開(kāi)銷(xiāo);考慮到可擴(kuò)展性?抽象層,在客戶(hù)端代碼中均使?抽象層進(jìn)?定義,增加了系統(tǒng)的抽象性和理解難度。使?場(chǎng)景:需要靈活、可擴(kuò)展的框架時(shí);當(dāng)?個(gè)類(lèi)(?如客戶(hù)端類(lèi))不知道所需要的對(duì)象的類(lèi)時(shí)(需要知道其對(duì)應(yīng)的??);個(gè)類(lèi)通過(guò)其?類(lèi)來(lái)確定創(chuàng)建那個(gè)對(duì)象。六、抽象??模式抽象??模式的定義是:為創(chuàng)建?組相關(guān)或相互依賴(lài)的對(duì)象提供?個(gè)接?,?且?需指定他們的具體類(lèi)。抽象??模式是???法模式的泛化版,即???法模式只是抽象??模式的?種特殊情況。我們還是以Dao提供的數(shù)據(jù)庫(kù)服務(wù)為例,上?我們提供了?個(gè)?戶(hù)注冊(cè)的服務(wù),下?我們?cè)偬峁?個(gè)?戶(hù)登錄的服務(wù)。接?:publicinterfaceDaoLoginService{voidcheckValid(Useruser);}Mysql實(shí)現(xiàn)類(lèi):publicclassDaoMysqLoginServicelImplimplementsDaoLoginService{@OverridepublicvoidcheckValid(Useruser){if(=="張三"&&user.password=="123456"){System.out.println("使?Mysql驗(yàn)證?戶(hù):"++"通過(guò)");}else{

System.out.println("使?Mysql驗(yàn)證?戶(hù):"++"失敗");}}}Oracle實(shí)現(xiàn)類(lèi)publicclassDaoOracleLoginServiceImplimplementsDaoLoginService{@OverridepublicvoidcheckValid(Useruser){if(=="張三"&&user.password=="123456"){System.out.println("使?Oracle驗(yàn)證?戶(hù):"++"通過(guò)");}else{System.out.println("使?Oracle驗(yàn)證?戶(hù):"++"失敗");}}}我們讓??接?可以提供所有的服務(wù)publicinterfaceDaoFactory{DaoRegisterServicecreateDaoRegisterService();DaoLoginServicecreateDaoLoginService();}publicclassDaoMysqlFactoryimplementsDaoFactory{@OverridepublicDaoRegisterServicecreateDaoRegisterService(){returnnewDaoMysqlRegisterServiceImpl();}@OverridepublicDaoLoginServicecreateDaoLoginService(){returnnewDaoMysqLoginServicelImpl();}}publicclassDaoOracleFactoryimplementsDaoFactory{@OverridepublicDaoRegisterServicecreateDaoRegisterService(){returnnewDaoOracleRegisterServiceImpl();}@OverridepublicDaoLoginServicecreateDaoLoginService(){returnnewDaoOracleLoginServiceImpl();}}使?客戶(hù)端驗(yàn)證如下:publicclassClient{publicstaticvoidmain(String[]args){Useruser=newUser();="張三";

user.password="123456";//項(xiàng)?初期//DaoFactorydaoFactory=newDaoMysqlFactory();//DaoRegisterServiceregisterService=daoFactory.createDaoRegisterService();//registerService.insert(user);DaoFactorydaoFactory=newDaoOracleFactory();DaoRegisterServiceregisterService=daoFactory.createDaoRegisterService();DaoLoginServiceloginService=daoFactory.createDaoLoginService();registerService.insert(user);loginService.checkValid(user);}}結(jié)果:注冊(cè)?戶(hù):張三到Oracle數(shù)據(jù)庫(kù)成功使?Oracle驗(yàn)證?戶(hù):張三通過(guò)抽象??是所有形式的??模式中最為抽象和最具?般性的?種形態(tài),其優(yōu)缺點(diǎn)?致如下:隔離了具體類(lèi)的?成,使得客戶(hù)并不需要知道什么被創(chuàng)建,具有良好的封裝性。橫向擴(kuò)展容易。同個(gè)產(chǎn)品族如果需要增加多個(gè)產(chǎn)品,只需要增加新的??類(lèi)和產(chǎn)品類(lèi)即可??v向擴(kuò)展困難。如果增加新的產(chǎn)品組,抽象??類(lèi)也要添加創(chuàng)建該產(chǎn)品組的對(duì)應(yīng)?法,這樣?來(lái)所有的具體??類(lèi)都要做修改了,嚴(yán)重違背了開(kāi)閉原則。在實(shí)際的應(yīng)?開(kāi)發(fā)中,?般將具體類(lèi)的類(lèi)名?配置?件中,再通過(guò)Java的反射機(jī)制讀取XML格式的配置?件,根據(jù)存儲(chǔ)在XML?件中的類(lèi)名字符串?成對(duì)象。新建XML?件config.xml如下:DaoMysqlFactory新建?具類(lèi)XmlUtil,通過(guò)反射機(jī)制獲取??類(lèi)名稱(chēng)。publicclassXmlUtil{publicstaticObjectgetDaoFactroyBean(){try{//創(chuàng)建DOM對(duì)象DocumentBuilderFactorybuilderFactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=builderFactory.newDocumentBuilder();Documentdoc=builder.parse(newFile("./src/config.xml"));//獲取包含類(lèi)名的?本點(diǎn)NodeListlist=doc.getElementsByTagName("FactoryName");Nodenode=list.item(0).getFirstChild();StringfactoryName=node.getNodeValue();//利?反射機(jī)制,通過(guò)類(lèi)名創(chuàng)建實(shí)例Classc=Class.forName("Facotry."+factoryName);Objectobj=c.newInstance();returnobj;}catch(Exceptionex){ex.printStackTrace();}returnnull;}

}在客戶(hù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論