站長資訊網
        最全最豐富的資訊網站

        Java工廠方法模式詳解

        本篇文章給大家帶來了關于java的相關知識,其中主要介紹了工廠方法模式的相關問題,工廠方法模式也叫虛擬構造器模式或者多態工廠模式,它屬于類創建型模式,希望對大家有幫助。

        Java工廠方法模式詳解

        推薦學習:《java教程》

        一、什么是工廠方法模式?

        工廠方法模式:也叫虛擬構造器模式或者多態工廠模式,它屬于類創建型模式。

        在工廠方法模式中,工廠父類負責定義創建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。

        我們知道在現在的真實工廠內分工越來越細,越來越專業化。。各種產品有專門的工廠生產,徹底告別了自給自足的小農經濟時代,這大大縮短了產品的生產周期,提高了生產效率。而工廠方法模式即滿足了開閉原則,也繼承了簡單工廠模式的優點。

        舉例說明:

        在簡單工廠模式的文章中的可樂工廠,因為只有一個工廠類,所以任何產品都需要在這個類里面去修改和調整,而工廠方法模式就是有多個工廠,每個工廠生產一個產品,如果有需要增加新產品,我們直接再新建一個工廠即可,就不需要在其他工廠的內部再去修改,這樣就符合了開閉原則。

        二、工廠方法模式的優缺點

        優點:

        • 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程

        • 靈活性增強,對于新產品的創建,只需多寫一個相應的工廠類

        • 典型的解耦框架。高層模塊只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則

        缺點:

        • 類的個數容易過多,增加復雜度

        • 增加了系統的抽象性和理解難度

        • 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決(抽象工廠模式在下一篇文章)

        三、模式的結構與實現

        結構由以下四個部分組成:

        • 抽象工廠(Abstract Factory):提供了創建產品的接口,調用者通過它訪問具體工廠的工廠方法 newProduct() 來創建產品

        • 具體工廠(ConcreteFactory):主要是實現抽象工廠中的抽象方法,完成具體產品的創建

        • 抽象產品(Product):定義了產品的規范,描述了產品的主要特性和功能

        • 具體產品(ConcreteProduct):實現了抽象產品角色所定義的接口,由具體工廠來創建,它同具體工廠之間一一對應

        結構圖:

        Java工廠方法模式詳解

        4、工廠方法模式代碼實現

        還是以上一篇文章的可樂工廠為例:
        產品有:可口可樂、百事可樂、無糖可樂
        在簡單工廠模式中只有一個可樂工廠,可以生產三種產品,在工廠方法模式中就可以有多個工廠來生成對應的產品:

        抽象工廠: 可樂工廠(可以理解成總廠)
        百事可樂工廠: 生成百事可樂
        可口可樂工廠: 生成可口可樂
        無糖可樂工廠: 生成無糖可樂

        生產可樂的方法:

        /**  *  提供了產品的接口  */public interface Cola {      //生產可樂的方法     public void cola();}

        可樂抽象工廠:

        /**  * 可樂抽象工廠(可以理解成可樂總廠,旗下還有很多分廠)  */public interface ColaFactory {      public Cola newCola();}

        生成三種可樂的方法:
        可樂可樂:

        /**  * 產品名稱:可樂可樂,實現了產品的接口  */public class CocaCola implements Cola{      @Override     public void cola() {         System.out.println("開始生產可口可樂");     }}

        百事可樂:

        /**  *  * 產品名稱:百事可樂,實現了產品的接口  */public class PepsiCola implements Cola{      @Override     public void cola() {         System.out.println("開始生產百事可樂");     }}

        無糖可樂:

        /*  * 產品名稱:無糖可樂,實現了產品的接口  */public class SugarFreeCola implements Cola{      @Override     public void cola() {         System.out.println("開始生產無糖可樂");     }}

        三個產品對應三個工廠:

        生產可口可樂的工廠:

        /**  *  * 具體工廠1:可口可樂工廠  */public class CocaColaFactory implements ColaFactory{          @Override     public Cola newCola() {         System.out.println("我是可樂工廠下面的可口可樂工廠");         return new CocaCola();     }}

        生產百事可樂的工廠:

        /**  *  * 具體工廠2:百事可樂工廠  */public class PepsiColaFactory implements ColaFactory{      @Override     public Cola newCola() {         System.out.println("我是可樂工廠下面的百事可樂工廠");         return new PepsiCola();     }}

        生產無糖可樂的工廠:

        /*  * 具體工廠3:無糖可樂工廠  */public class SugarFreeColaFactory implements ColaFactory{          @Override     public Cola newCola() {         System.out.println("我是可樂工廠下面的無糖可樂工廠");         return new SugarFreeCola();     }}

        到這里目前有:

        • 一生產可樂的方法

        • 一個可樂工廠(下面有多個小工廠)

        • 三個生產三種類型可樂的方法(實現可樂接口)

        • 三個可樂工廠(生產三種可樂,實現可樂工廠接口)

        測試類:

        public class Test {     public static void main(String[] args) {          try{              //新建一個可樂方法對象             Cola a;              //新建一個可樂工廠對象             ColaFactory af;              //告訴可樂工廠,你需要什么可樂,并且通知對應的分工廠             af = (ColaFactory) new PepsiColaFactory();             //執行對于生產方法             a = af.newCola();             a.cola();                      }catch (Exception e ){             System.out.println(e.getMessage());         }     }}

        比如我現在需要百事可樂,我在af內傳入百事可樂工廠:

        我是可樂工廠下面的無糖可樂工廠 開始生產無糖可樂

        如果傳入CocaColaFactory

        我是可樂工廠下面的可口可樂工廠 開始生產可口可樂

        5、總結

        這就是工廠方法模式,和簡單工廠模式有所不同,在這個模式內有一個抽象工廠接口,也就是你需要增加新產品后,不需要在原本的工廠內去修改代碼,而是直接新建一個工廠,去實現抽象工廠即可,也是符合了開閉原則。

        當然缺點也就是工廠多了,管理變得復雜,也增加了系統的抽象性和理解難度,而且抽象產品只能生產一種產品,但是此弊端可使用抽象工廠模式解決(抽象工廠模式在下一篇文章)

        推薦學習:《java教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久久精品国产亚洲成人满18免费网站 | 精品国产一区二区三区在线观看| 亚洲精品卡2卡3卡4卡5卡区| 99久久精品免费| 国产精品午睡沙发系列| 亚洲午夜精品一级在线播放放| 国产精品亚洲mnbav网站| 国产精品1区2区| 国产麻豆精品久久一二三| 亚洲码国产精品高潮在线 | 51精品资源视频在线播放| 99国产欧美精品久久久蜜芽| 全球AV集中精品导航福利| 一本色道久久综合亚洲精品| 欧美精品xxxxbbbb| 精品乱子伦一区二区三区高清免费播放 | 久久精品国产免费| 99re国产精品视频首页| 国产国产精品人在线视| 国产精品拍天天在线| 久久夜色精品国产噜噜亚洲AV| 中文字幕日韩精品在线| 无码精品人妻一区二区三区免费 | 欧美亚洲精品在线| 国产日韩一区在线精品欧美玲| 无码国产精品一区二区免费3p| 亚洲精品99久久久久中文字幕| 亚洲av无码成人精品国产| 天天视频国产精品| 亚洲国产成人精品女人久久久 | 亚洲AV日韩精品久久久久久| 中文字幕无码久久精品青草| 中文字幕日韩精品在线| 亚洲精品国产精品乱码不卡√| 亚洲欧美日韩国产一区二区三区精品| 日韩精品无码免费视频| 日韩AV毛片精品久久久| 亚洲精品无码MV在线观看| 少妇人妻偷人精品视频| 日韩精品人妻系列无码专区免费 | 欧美日韩国产中文精品字幕自在自线 |