日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

工厂方法 coding

發(fā)布時間:2024/4/13 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 工厂方法 coding 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引入我們的工廠方法設(shè)計(jì)模式,首先我們先創(chuàng)建一個包,我們現(xiàn)在來看一下他的類圖,首先看Video,Video有三個子類,他們?nèi)齻€屬于同一個產(chǎn)品等級,他們都是視頻,那這里面去擴(kuò)展一下,產(chǎn)品族的一個概念,例如現(xiàn)在視頻,就是教程,教程就是視頻,但是后續(xù)網(wǎng)站規(guī)定,你有了視頻之后,這個兩個大包在一起,才可以稱之為教程,那對于Pathon,或者JAVA,或者FE來說,JAVA的視頻,Java的手記,他們都屬于JAVA,他們屬于同一產(chǎn)品族,而JAVA的視頻,Python的視頻,前端的視頻,他們屬于同一產(chǎn)品等級,Java的手記,Python的手記,前端的手記,屬于同一產(chǎn)品等級,Python的視頻,Python的手記,屬于同一個產(chǎn)品族,希望小伙伴們理解一下,這里就和之前說的美的的冰箱,海爾的冰箱,他們都是屬于同一個產(chǎn)品等級,但是美的的空調(diào),美的的冰箱,美的的洗衣機(jī),都是美的,他們屬于同一產(chǎn)品族,而抽象工廠,就是解決產(chǎn)品族的問題,而工廠方法和工廠最大的區(qū)別,以及靈活應(yīng)用的點(diǎn),不在于此,那我們現(xiàn)在接著來講,然后再看一下工廠,一個抽象的視頻工廠,他有三個子類,前端的工廠,Pathon的視頻,和JAVA的視頻工廠,我們再看一下他們的依賴關(guān)系,可以很清楚的看到,工廠來創(chuàng)建FEVideo,Python視頻工廠創(chuàng)建PathonVideo,Java視頻工廠創(chuàng)建JavaVideo,而應(yīng)用層client代碼,現(xiàn)在只用了PathonVideoFactory,如果我們在應(yīng)用層client端,交給應(yīng)用層去創(chuàng)建工廠的,也就是說VideoFactory把創(chuàng)建某個具體視頻的職責(zé)已經(jīng)交由子類來實(shí)現(xiàn)了,他不再負(fù)責(zé)創(chuàng)建具體的課程視頻,這個圖為了他自動生成呢,相信能夠理解工廠方法了,他還是非常簡單的,例如說我們現(xiàn)在還有一個算法視頻,也要上線了,他呢作為一個算法課程,我們只需要創(chuàng)建一個算法的Video,下邊再創(chuàng)建一個算法的Factory,對于其他的類我們不需要修改,這里說的其它的類不包括應(yīng)用層的Test,這個客戶端調(diào)用方,上面的這些類都不用動,我只需要擴(kuò)展Video的子類,擴(kuò)展VideoFactory的子類,就可以,因?yàn)槭菍U(kuò)展開放的,我們不需要修改已有的類,這就降低了風(fēng)險性,那目前我們擴(kuò)展就是在這里面加類,是非常非常方便的,但是呢任何設(shè)計(jì)模式,都是有優(yōu)缺點(diǎn)的,我們要根據(jù)實(shí)際的應(yīng)用場景來采取不同的解決方案,那現(xiàn)在呢我們根據(jù)這個圖抽象幾個名詞,首先產(chǎn)品,產(chǎn)品是視頻,創(chuàng)建者就是VideoFactory,而實(shí)際的創(chuàng)建者就是VideFactory的子類,這三個,而產(chǎn)品Video,具體這三個,產(chǎn)品具體的產(chǎn)品,創(chuàng)建者,具體的創(chuàng)建者,那對于工廠方法呢,就講完了,接下來我們通過業(yè)務(wù)場景的演進(jìn)引出抽象工廠 package com.learn.design.pattern.creational.factorymethod;/*** 這個類也是抽象類* 這里使用interface也是OK的* 這里并不強(qiáng)制* 我們定義VideoFactory的抽象方法getVideo* public interface VideoFactory* public Video getVideo();* 這樣改也是OK的* 至少在我們的例子中也是OK的* 如果改成interface* 默認(rèn)也是public* 我們還是使用抽象類* 因?yàn)樵趯?shí)際的應(yīng)用場景* 我們這個類可能對于某些行為* 甚至某些屬性是已知的* 所以這里可能除了抽象方法* 已知的實(shí)現(xiàn)* 那么用抽象類是比較合適的* 那如果這里面全是未知的* 我們完全可以使用接口來定義* 那這里其實(shí)并不固定* 根據(jù)實(shí)際的業(yè)務(wù)場景來選擇* 就可以了* * VideoFactory只定義規(guī)范契約* 并不決定產(chǎn)生哪一種類的視頻* 產(chǎn)生哪一類視頻* 完全交給子類來決定* 并且實(shí)現(xiàn)* * * * @author Leon.Sun**/ public abstract class VideoFactory {/*** 把它改成抽象方法* 而改成抽象方法之后* type就不需要傳了* 我們需要再子類中進(jìn)行實(shí)現(xiàn)* 那具體調(diào)用哪個Factory的實(shí)現(xiàn)呢* 全部交由子類* 抽象方法* 如果我們現(xiàn)在只有一個抽象方法* * * @return*/public abstract Video getVideo();/*** 通過反射的方式* */ // public Video getVideo(Class c){ // Video video = null; // try { // video = (Video) Class.forName(c.getName()).newInstance(); // } catch (InstantiationException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } catch (ClassNotFoundException e) { // e.printStackTrace(); // } // return video; // } // ///*** 現(xiàn)在創(chuàng)建對象都在這個工廠里面* 而工廠方法講的是說把創(chuàng)建的職能移交到子類* 而現(xiàn)在VideoFactory并沒有相應(yīng)的子類* 也就是把創(chuàng)建的過程延遲到子類進(jìn)行創(chuàng)建* 那這個就是工廠方法的一個核心* 現(xiàn)在無論是java還是pathon* 都在VideoFactory里邊* VideoFactory負(fù)責(zé)所有課程Video實(shí)例化* 現(xiàn)在我們要對他進(jìn)行改造* 變成由一群子類來負(fù)責(zé)* 實(shí)例化對應(yīng)的課程Video* 我們就會實(shí)現(xiàn)VideoFactory超類的代碼* 和子類創(chuàng)建對象的代碼* * */ // public Video getVideo(String type){ // if("java".equalsIgnoreCase(type)){ // return new JavaVideo(); // }else if("python".equalsIgnoreCase(type)){ // return new PythonVideo(); // } // return null; // }} package com.learn.design.pattern.creational.factorymethod;/*** * @author Leon.Sun**/ public class JavaVideo extends Video {@Overridepublic void produce() {System.out.println("錄制Java課程視頻");} } package com.learn.design.pattern.creational.factorymethod;/*** 對于生產(chǎn)Video* 這些都是同一個產(chǎn)品等級* 也就是說無論JAVA視頻還是Python視頻* 他們的產(chǎn)品等級是一致的* 都是視頻* 這里面理解一個概念* 相同的類型的一個產(chǎn)品* 我們稱之為產(chǎn)品等級* 他們的等級都是在視頻一個等級上* 所以呢JAVA視頻Pathon視頻屬于一個產(chǎn)品等級* 那產(chǎn)品等級產(chǎn)品族是對比工廠方法和抽象方法的一個重要概念* 所以嘗試?yán)斫庖幌? 這個就跟電器一樣* 比如說電冰箱* 海信有美的也有* 海爾也有* 他們都有電冰箱* 那對于電冰箱來說* 他們屬于同一個產(chǎn)品等級* 那候旭我們講到產(chǎn)品族的時候呢* 來進(jìn)行對比* 只要這兩個概念理解透了* 對于工廠方法和抽象工廠* 對于我們理解和實(shí)際使用是有非常大的幫助的* 那工廠方法呢* 我們是為了解決同理產(chǎn)品等級的* 對于Java視頻Pathon視頻* 他們都是同一個產(chǎn)品等級* 那我們先創(chuàng)建一個Java視頻的一個工廠* * * * @author Leon.Sun**/ public abstract class Video {public abstract void produce();} package com.learn.design.pattern.creational.factorymethod;/*** 他繼承VideoFactory* 這里面注意* 不要導(dǎo)錯* 默認(rèn)IDEA是就近的* 本包下面的VideoFactory* 如果小伙伴引錯一定要檢查* * * @author Leon.Sun**/ public class JavaVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {/*** 這里直接返回一個JavaVideo對象就可以了* */return new JavaVideo();} } package com.learn.design.pattern.creational.factorymethod;/*** 這里只產(chǎn)Pathon的視頻* 現(xiàn)在我們體會一下* 具體產(chǎn)生什么類型的視頻* 是由VideoFactory的子類來決定的* 而不是由VideoFactory來決定了* 這里面注意一下* * * @author Leon.Sun**/ public class PythonVideoFactory extends VideoFactory {@Overridepublic Video getVideo() {/*** new一個PathonVideo* */return new PythonVideo();} } package com.learn.design.pattern.creational.factorymethod;/*** FE就是前段* Front-End的一個縮寫* 那這個類就創(chuàng)建好了* 繼承Video這個方法* * * * @author Leon.Sun**/ public class FEVideo extends Video{/*** 里面有一個produce* */@Overridepublic void produce() {System.out.println("錄制FE課程視頻");} } package com.learn.design.pattern.creational.factorymethod;/*** 同理我們還需要FEVideo的一個工廠* 繼承VideoFactory* 然后寫他的實(shí)現(xiàn)* * * @author Leon.Sun**/ public class FEVideoFactory extends VideoFactory{@Overridepublic Video getVideo() {/*** 這里面直接返回FEVideo就可以了* */return new FEVideo();} } package com.learn.design.pattern.creational.factorymethod;/*** * @author Leon.Sun**/ public class Test {public static void main(String[] args) {/*** 首先創(chuàng)建一個VideoFactory對象* 賦值* 賦值我們就直接new一個JavaVideoFactory* 父類的引用指向子類的一個實(shí)現(xiàn)* 那Java的視頻工廠就創(chuàng)建好了* */VideoFactory videoFactory = new JavaVideoFactory();/*** 如果我們想去創(chuàng)建Pathon的視頻* 只需要指向PathonVideo工廠就可以了* 非常簡單* 那對于應(yīng)用來說去修改的時候* 也會非常簡單* 那現(xiàn)在我們來關(guān)注一下他的擴(kuò)展性* 那對于簡單工廠* 如果我們現(xiàn)在要加前端的一個課程* 很顯然VideoFactory這里面* 肯定是需要修改的* 而現(xiàn)在我們來看一下效果* * */VideoFactory videoFactory2 = new PythonVideoFactory();VideoFactory videoFactory3 = new FEVideoFactory();/*** 然后獲得Video* 用videoFactory.getVideo來賦值* */Video video = videoFactory.getVideo();/*** 然后調(diào)用Video的produce方法* */video.produce();}}

?

總結(jié)

以上是生活随笔為你收集整理的工厂方法 coding的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。