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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

工厂方法 coding

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

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

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。