亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

《JAVA與模式》之工廠方法模式

2019-11-06 06:15:55
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述工廠方法模式的:

  工廠方法模式是類的創建模式,又叫做虛擬構造子(Virtual Constructor)模式或者多態性工廠(Polymorphic Factory)模式。

  工廠方法模式的用意是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類中。

那么工廠方法模式是在什么場景下使用呢,下面就以本人的理解舉例說明:

  相信很多人都做過導入導出功能,就拿導出功能來說。有這么一個需求:XX系統需要支持對數據庫中的員工薪資進行導出,并且支持多種格式如:HTML、CSV、PDF等,每種格式導出的結構有所不同,比如:財務跟其他人對導出薪資的HTML格式要求可能會不一樣,因為財務可能需要特定的格式方便核算或其他用途。

  如果使用簡單工廠模式,則工廠類必定過于臃腫。因為簡單工廠模式只有一個工廠類,它需要處理所有的創建的邏輯。假如以上需求暫時只支持3種導出的格式以及2種導出的結構,那工廠類則需要6個if else來創建6種不同的類型。如果日后需求不斷增加,則后果不堪設想。

  這時候就需要工廠方法模式來處理以上需求。在工廠方法模式中,核心的工廠類不再負責所有的對象的創建,而是將具體創建的工作交給子類去做。這個核心類則搖身一變,成為了一個抽象工廠角色,僅負責給出具體工廠子類必須實現的接口,而不接觸哪一個類應當被實例化這種細節。

  這種進一步抽象化的結果,使這種工廠方法模式可以用來允許系統在不修改具體工廠角色的情況下引進新的產品,這一特點無疑使得工廠方法模式具有超過簡單工廠模式的優越性。下面就針對以上需求設計UML圖:

  從上圖可以看出,這個使用的工廠方法模式的系統涉及到以下角色:

 

  抽象工廠(ExportFactory)角色:擔任這個角色的是工廠方法模式的核心,任何在模式中創建對象的工廠類必須實現這個接口。在實際的系統中,這個角色也常常使用抽象類實現。

  具體工廠(ExportHtmlFactory、ExportPdfFactory)角色:擔任這個角色的是實現了抽象工廠接口的具體JAVA類。具體工廠角色含有與業務密切相關的邏輯,并且受到使用者的調用以創建導出類(如:ExportStandarDHTMLFile)。

  抽象導出(ExportFile)角色:工廠方法模式所創建的對象的超類,也就是所有導出類的共同父類或共同擁有的接口。在實際的系統中,這個角色也常常使用抽象類實現。

  具體導出(ExportStandardHtmlFile等)角色:這個角色實現了抽象導出(ExportFile)角色所聲明的接口,工廠方法模式所創建的每一個對象都是某個具體導出角色的實例。

源代碼  首先是抽象工廠角色源代碼。它聲明了一個工廠方法,要求所有的具體工廠角色都實現這個工廠方法。參數type表示導出的格式是哪一種結構,如:導出HTML格式有兩種結構,一種是標準結構,一種是財務需要的結構。

public%20interface%20ExportFactory%20{%20%20%20%20public%20ExportFile%20factory(String%20type);}  具體工廠角色類源代碼:

public class ExportHtmlFactory implements ExportFactory{    @Override    public ExportFile factory(String type) {        // TODO Auto-generated method stub        if("standard".equals(type)){                        return new ExportStandardHtmlFile();                    }else if("financial".equals(type)){                        return new ExportFinancialHtmlFile();                    }else{            throw new RuntimeException("沒有找到對象");        }    }}復制代碼復制代碼
public class ExportPdfFactory implements ExportFactory {    @Override    public ExportFile factory(String type) {        // TODO Auto-generated method stub        if("standard".equals(type)){                        return new ExportStandardPdfFile();                    }else if("financial".equals(type)){                        return new ExportFinancialPdfFile();                    }else{            throw new RuntimeException("沒有找到對象");        }    }}復制代碼

  抽象導出角色類源代碼:

public interface ExportFile {    public boolean export(String data);}

  具體導出角色類源代碼,通常情況下這個類會有復雜的業務邏輯。

復制代碼
public class ExportFinancialHtmlFile implements ExportFile{    @Override    public boolean export(String data) {        // TODO Auto-generated method stub        /**         * 業務邏輯         */        System.out.PRintln("導出財務版HTML文件");        return true;    }}復制代碼復制代碼
public class ExportFinancialPdfFile implements ExportFile{    @Override    public boolean export(String data) {        // TODO Auto-generated method stub        /**         * 業務邏輯         */        System.out.println("導出財務版PDF文件");        return true;    }}復制代碼復制代碼
public class ExportStandardHtmlFile implements ExportFile{    @Override    public boolean export(String data) {        // TODO Auto-generated method stub        /**         * 業務邏輯         */        System.out.println("導出標準HTML文件");        return true;    }}復制代碼復制代碼
public class ExportStandardPdfFile implements ExportFile {    @Override    public boolean export(String data) {        // TODO Auto-generated method stub        /**         * 業務邏輯         */        System.out.println("導出標準PDF文件");        return true;    }}復制代碼

客戶端角色類源代碼:

復制代碼
public class Test {    /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        String data = "";        ExportFactory exportFactory = new ExportHtmlFactory();        ExportFile ef = exportFactory.factory("financial");        ef.export(data);    }}復制代碼

工廠方法模式的活動序列圖

  客戶端創建ExportHtmlFactory對象,這時客戶端所持有變量的靜態類型為ExportFactory,而實際類型為ExportHtmlFactory。然后客戶端調用ExportHtmlFactory對象的工廠方法factory(),接著后者調用ExportFinancialHtmlFile的構造子創建出導出對象。

工廠方法模式和簡單工廠模式

  工廠方法模式和簡單工廠模式在結構上的不同很明顯。工廠方法模式的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上?! 」S方法模式退化后可以變得很像簡單工廠模式。設想如果非常確定一個系統只需要一個具體工廠類,那么不妨把抽象工廠類合并到具體工廠類中去。由于只有一個具體工廠類,所以不妨將工廠方法改為靜態方法,這時候就得到了簡單工廠模式。

  如果系統需要加入一個新的導出類型,那么所需要的就是向系統中加入一個這個導出類以及所對應的工廠類。沒有必要修改客戶端,也沒有必要修改抽象工廠角色或者其他已有的具體工廠角色。對于增加新的導出類型而言,這個系統完全支持“開-閉原則”。  

完結

  一個應用系統是由多人開發的,導出的功能是你實現的,但是使用者(調用這個方法的人)可能卻是其他人。這時候你應該設計的足夠靈活并盡可能降低兩者之間的耦合度,當你修改或增加一個新的功能時,使用者不需要修改任何地方。假如你的設計不夠靈活,那么將無法面對客戶多變的需求??赡芤粋€極小的需求變更,都會使你的代碼結構發生改變,并導致其他使用你所提供的接口的人都要修改他們的代碼。牽一處而動全身,這就使得日后這個系統將難以維護。

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩国产高清污视频在线观看| 久久九九亚洲综合| 亚洲色图50p| 黑人巨大精品欧美一区二区一视频| 国产999在线观看| 亚洲国内精品视频| 91黑丝高跟在线| 国产精品jizz在线观看麻豆| 茄子视频成人在线| 激情懂色av一区av二区av| 久久影视电视剧免费网站清宫辞电视| 久久久久久久亚洲精品| 国产欧美中文字幕| 日韩精品在线视频观看| 亚洲一区亚洲二区| 午夜精品久久久久久久白皮肤| 97成人在线视频| 91av视频导航| 欧美xxxx18性欧美| 亚洲另类xxxx| 欧美黑人xxxx| 51视频国产精品一区二区| 8x拔播拔播x8国产精品| 精品精品国产国产自在线| 精品一区二区电影| 日韩小视频网址| 亚洲一区中文字幕在线观看| 精品久久久香蕉免费精品视频| 亚洲美女动态图120秒| 亚洲精品一区av在线播放| 中文字幕国产日韩| 久久精品国产视频| 亚洲精品色婷婷福利天堂| 成人h片在线播放免费网站| 国产人妖伪娘一区91| 岛国视频午夜一区免费在线观看| 国产狼人综合免费视频| 久久久国产一区| 亚洲国产婷婷香蕉久久久久久| 久久精品视频在线| 日韩影视在线观看| 日韩欧美国产激情| 亚洲免费一级电影| 欧美激情第三页| 日本国产欧美一区二区三区| 成人精品一区二区三区电影黑人| 欧美激情国产日韩精品一区18| 在线日韩欧美视频| 久久久综合免费视频| 欧美日韩不卡合集视频| 日韩不卡在线观看| 成人有码视频在线播放| 久久久国产在线视频| 亚洲电影免费观看高清完整版| 亚洲乱码一区二区| 欧美亚洲一级片| 在线视频欧美性高潮| 亚洲国内精品在线| 久久久国产一区二区三区| 丝袜美腿亚洲一区二区| 欧美激情在线播放| 伊是香蕉大人久久| 国产成人精品日本亚洲专区61| 久久伊人免费视频| 色狠狠久久aa北条麻妃| 日本精品久久久久久久| 97久久精品人搡人人玩| 亚洲日韩中文字幕| 久久激情视频免费观看| 欧美日韩在线视频首页| 国产精品久久久久久久久久ktv| 深夜福利91大全| 韩日精品中文字幕| 一区二区欧美亚洲| 4438全国亚洲精品在线观看视频| 国产精品久久一区| 欧美猛交ⅹxxx乱大交视频| 欧美与黑人午夜性猛交久久久| 日本亚洲欧美成人| 欧美一区二区三区四区在线| 插插插亚洲综合网| 午夜精品久久久久久久久久久久久| 成人福利免费观看| 日韩视频在线免费| 97超碰国产精品女人人人爽| 91免费精品国偷自产在线| 亚洲人成欧美中文字幕| 久久综合色88| 亚洲国产精品电影在线观看| 国产91久久婷婷一区二区| 色婷婷综合久久久久| 亚洲xxxx3d| 国产精品av在线| 亚洲日本中文字幕| 91日韩在线播放| 久久频这里精品99香蕉| 中文字幕欧美精品日韩中文字幕| 欧美日韩一区二区三区在线免费观看| 欧美精品在线观看91| 欧美亚洲另类制服自拍| 国产日韩换脸av一区在线观看| 一区二区在线视频播放| 欧美肥婆姓交大片| 日韩一区二区福利| 国产美女被下药99| 日韩欧美精品免费在线| 国产精品免费久久久久久| 插插插亚洲综合网| 日日摸夜夜添一区| 在线精品播放av| 麻豆国产va免费精品高清在线| 综合网日日天干夜夜久久| 福利一区福利二区微拍刺激| 欧美成人高清视频| 日韩在线观看免费av| 成人性生交大片免费看小说| 久久久久国产视频| 久久精品视频99| 日韩一级裸体免费视频| 96精品久久久久中文字幕| 国产午夜精品麻豆| 久久精品免费电影| 亚洲成人在线网| 久久精品电影网| 中文字幕日韩高清| 国产精品99久久99久久久二8| 日韩欧美在线看| 国产一区二区三区欧美| 日本高清+成人网在线观看| 国产精品一久久香蕉国产线看观看| 在线精品91av| 日韩第一页在线| 国产精品欧美久久久| 乱亲女秽乱长久久久| 国产在线拍偷自揄拍精品| 一区二区三区 在线观看视| 欧美大全免费观看电视剧大泉洋| 亚洲精品一区二三区不卡| 亚洲成人av中文字幕| 日韩av三级在线观看| 国产精品一区av| 81精品国产乱码久久久久久| 亚洲综合视频1区| 成人精品视频在线| 日韩精品中文字| 国产综合福利在线| 成人xvideos免费视频| 亚洲成人av在线| 亚洲欧美国产一本综合首页| 国产精品亚洲激情| 一区二区三区久久精品| 欧美性猛交xxxx免费看| 中日韩美女免费视频网址在线观看| 亚洲女成人图区| 国产精品69久久久久| 国产精品偷伦视频免费观看国产| 亚洲人a成www在线影院| 日韩精品在线观看一区| 国产一区二区在线免费| 国产亚洲精品久久久久动| 欧美电影免费观看高清| 欧美激情在线播放| 欧美情侣性视频| 日韩免费高清在线观看|