工厂方法 coding
生活随笔
收集整理的這篇文章主要介紹了
工厂方法 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工厂方法讲解
- 下一篇: 工厂方法源码解析(jdk+logback