Java设计模式学习之工厂模式
生活随笔
收集整理的這篇文章主要介紹了
Java设计模式学习之工厂模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單工廠模式
我直接上代碼代碼里有很詳細的注解
//簡單工廠模式 是由一個工廠對象決定創建出哪種產品
class Factory1 {publicstatic void main(String[] args){//通過工廠方法生產白面包BreadMakerwhite=BreadFactory.createBreadMaker(0);white.GetMaker();//通過工廠方法生產黑面包BreadMakerblack=BreadFactory.createBreadMaker(1);black.GetMaker();//通過工廠方法生產綠面包BreadMakergreen=BreadFactory.createBreadMaker(2);green.GetMaker();} } //面包類抽象類 abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包類 繼承抽象類 覆寫抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}} //黑面包類classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//綠面包類classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了綠面包");}}//面包生產方法 通過靜態方法BreadMakercreateBreadMaker(int breadType)決定生產哪種面包classBreadFactory{publicstatic BreadMaker createBreadMaker(int breadType){BreadMakerbreadMaker=null;switch(breadType){case0:breadMaker=new WhiteBread();break;case1:breadMaker=new BlackBread();break;case2:breadMaker=new GreenBread();break;default:break;}returnbreadMaker;}}//有一個問題 當需要增加面包類型時 就需要修改BreadFactory類 增加case分支 這樣違反了開閉原則。 //下面就有了工廠方法模式 定義一個用于創建的接口 讓子類決定實例化哪個類 工廠方法//使得一個類的實例化延遲到其子類工廠方法模式
//工廠方法模式 定義一個用于創建的接口 //讓子類決定實例化哪個類 工廠方法使得一個類的實例化延遲到其子類 class Factory2 {publicstatic void main(String[] args){IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();BreadMakerwhite=whiteBreadMakerFactory.createBreadMaker();white.GetMaker();IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();BreadMakerblack=blackBreadMakerFactory.createBreadMaker();black.GetMaker();IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();BreadMakergreen=greenBreadMakerFactory.createBreadMaker();green.GetMaker();IFactoryblueBreadMakerFactory=new BlueBreadMakerFactory();BreadMakerblue=blueBreadMakerFactory.createBreadMaker();blue.GetMaker();} }//面包類抽象類 abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包類 繼承抽象類 覆寫抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}} //黑面包類classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//綠面包類classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了綠面包");}}//藍面包類 新增加classBlueBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了藍面包");}}//工廠方法接口 interface IFactory {publicBreadMaker createBreadMaker(); } //白面包工廠類 class WhiteBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new WhiteBread();returnbreadMaker;} } //黑面包工廠類 class BlackBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlackBread();returnbreadMaker;} } //綠面包工廠類 class GreenBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new GreenBread();returnbreadMaker;} } //藍面包工廠類 class BlueBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlueBread();returnbreadMaker;} }//通過上面的例子 看以看出 當增加新產品時 在工廠方法模式時 只要相應的增加新增產品的類 // 和工廠類 這樣就能很好的符合開閉原則 當然 每增加一個產品 需要增加相應對方類和工廠類 也增加了額外的工作量 // 但是有一個問題 當我們需要增加一個類型的產品 比如披薩 但是我們可以重新利用之前已有的工廠,比如工廠 //的機器、設備等 那該如何呢。 如果按照工廠方法模式 那就需要增加披薩類 和披薩的工廠方法 而且這個工廠是新建的 //如要重新買設備 那該多浪費 // 基于此 提出了抽象工廠模式 比如 生產白面包的工廠還能生產白披薩 那么就節約設備資金啦, 也就是節約了代碼量
抽象工廠模式
//抽象工廠模式 class Factory3 {publicstatic void main(String[] args){IFactorywhiteBreadMakerFactory=new WhiteBreadMakerFactory();BreadMakerwhiteBread=whiteBreadMakerFactory.createBreadMaker();whiteBread.GetMaker();PizzawhitePizza=whiteBreadMakerFactory.createPizza();whitePizza.GetMaker();IFactoryblackBreadMakerFactory=new BlackBreadMakerFactory();BreadMakerblackBread=blackBreadMakerFactory.createBreadMaker();blackBread.GetMaker();PizzablackPizza=blackBreadMakerFactory.createPizza();blackPizza.GetMaker();IFactorygreenBreadMakerFactory=new GreenBreadMakerFactory();BreadMakergreenBread=greenBreadMakerFactory.createBreadMaker();greenBread.GetMaker();PizzagreenPizza=greenBreadMakerFactory.createPizza();greenPizza.GetMaker();//另一種類實例化的方法 反射try{Class<?>c=Class.forName("WhiteBreadMakerFactory");try{ whiteBreadMakerFactory=(IFactory)c.newInstance();whitePizza=whiteBreadMakerFactory.createPizza();whitePizza.GetMaker();}catch(Exception ee){}}catch(ClassNotFoundException e){}} }//面包類抽象類 abstract class BreadMaker{//得到面包抽象方法abstractpublic void GetMaker();}//白面包類 繼承抽象類 覆寫抽象方法classWhiteBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了白面包");}} //黑面包類classBlackBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了黑面包");}}//綠面包類classGreenBread extends BreadMaker{publicvoid GetMaker(){System.out.println("做出了綠面包");}}//新增的披薩類abstract class Pizza{abstractvoid GetMaker();}//白披薩classWhitePizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了白披薩");}}//黑披薩classBlackPizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了黑披薩");}}//綠披薩classGreenPizza extends Pizza{publicvoid GetMaker(){System.out.println("做出了綠披薩");}}//工廠方法接口 interface IFactory {publicBreadMaker createBreadMaker();publicPizza createPizza(); //新增 生產披薩方法 } //白面包工廠類 class WhiteBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new WhiteBread();returnbreadMaker;}publicPizza createPizza(){returnnew WhitePizza();} } //黑面包工廠類 class BlackBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new BlackBread();returnbreadMaker;}publicPizza createPizza(){returnnew BlackPizza();} } //綠面包工廠類 class GreenBreadMakerFactory implementsIFactory {public BreadMaker createBreadMaker(){BreadMakerbreadMaker=new GreenBread();returnbreadMaker;}publicPizza createPizza(){returnnew GreenPizza();} }//從以上代碼可以看出 當我們新增一類產品時 而且該類產品能夠重用工廠的資源 那么用抽象工廠方法 能夠 //很好的解決這個問題//工廠各方法比較 //1.簡單工廠模式比較簡單 分離了客戶端和后臺邏輯 使得客戶端無需關心后臺的實現 去除了客戶端與具體產品 //的依賴 增強了移植性能 但是其違背了開閉原則,添加新產品時將會非常麻煩。 //2.工廠方法模式 易于添加新產品 后臺模塊符合開閉原則 但是新產品的添加會大量的新增類,增加了工作量 //3.抽象工廠模式 分離了具體的類 客戶端直接操作抽象接口。//對于工廠模式, 需要靈活應用 在不同的場合運用不同的模式 這樣將會使我們的代碼更加健壯、并且更易維護和拓展.學習自 劉徑舟老師 張玉華老師編著的《設計模式其實很簡單》
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Java设计模式学习之工厂模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android OpenGL ES 2.
- 下一篇: JavaWeb之Servlet学习---