作為實際java開發經驗還不到一年的我,第一次寫博客,誠惶誠恐,怕把自己的謬誤公之於眾,誤人子弟,不過轉念一想,若是能有同行加以指點評判,將他們的真知灼見描述出來,那這篇文章就算拋轉引玉了。 最近在閱讀《Java編程思想》有關介面的最後一小節中,作者提出了工廠設計模式,用來解決 生成實現某個介面的對 ...
作為實際java開發經驗還不到一年的我,第一次寫博客,誠惶誠恐,怕把自己的謬誤公之於眾,誤人子弟,不過轉念一想,若是能有同行加以指點評判,將他們的真知灼見描述出來,那這篇文章就算拋轉引玉了。
最近在閱讀《Java編程思想》有關介面的最後一小節中,作者提出了工廠設計模式,用來解決---生成實現某個介面的對象。說實話,對設計模式近乎一無所知的我,看到這裡會想,這也太簡單了,腦子裡不假思索的會寫出這樣一個例子:
1 //氣 2 interface Air{ 3 void show(); 4 } 5 6 //悟空 7 class WuKong implements Air{ 8 @Override 9 public void show() { 10 System.out.println("悟空:龜派氣功"); 11 } 12 } 13 14 public class Test { 15 public static void main(String[] args) { 16 Air wk = new WuKong(); 17 wk.show(); 18 } 19 }
聯想到書中提到的工廠設計模式,我這時就會想:這個模式的設計目的是什麼?在什麼情況下用它能發揮模式的作用?怎麼寫出這個模式,而不純粹靠背的?
1.書中的解釋看的不太明白,後臺在網上找了一個通俗易懂的解釋:工廠設計模式是為了將對象的創建與使用進行分離。上面例子中創建了悟空對象,隨機就調用了show() ,而這種模式就是在悟空對象創建和使用這兩個環節中做文章。思路弄明白了,超級簡單。本來流程是:生成對象a-->a.m();演變成生成工廠類b,b中的方法n(),可以生成對象a,然後a.m()。看看代碼:
interface Air{ void show(); } //悟空 class WuKong implements Air{ @Override public void show() { System.out.println("悟空:龜派氣功"); } } //悟空工廠類,目的很單純,就為了創建悟空對象 class WuKongFactory{ public Air getAir(){ return new WuKong(); } } public class Test { public static void main(String[] args) { // Air wk = new WuKong(); // wk.show(); /** * 隨著引入工廠類,調用show方法也做了些調整,先創建悟空工廠類對象factory, * 重點來了,new WuKong()的操作被封裝到了getAir()裡面。 * 試想這樣一種情景:main()方法我們不改動它,可以自己新增修改其他類, * 在這種情況下:我們可以修改getAir()方法,來return任何包含有show()方法的對象(也就是實現Air介面), * 從而讓下麵的代碼輸出不同的結果。很顯然,註釋的那兩行代碼玩不出這種花樣。 */ WuKongFactory factory = new WuKongFactory(); factory.getAir().show(); } }
來,我們來驗證一下,在main()方法不變的情況下,我們新增一個實現Air介面的八戒類,看看效果:
//悟空工廠類,目的很單純,就為了創建悟空對象 class WuKongFactory{ public Air getAir(){ //註意:這裡不再是new WuKong() return new BaJie(); } } //八戒 class BaJie implements Air{ @Override public void show() { System.out.println("八戒:豬豬乾坤屁"); } }
這時factory.getAir()創建的是八戒對象,於是產生了不同的結果。還有一點優化:針對WuKongFactory這個getAir()方法,其實是這個模式的核心方法,它就是為了創建你想要解耦的那個對象的實例,可以如書中的例子一樣,把它抽離出來,封裝成一個介面,想創建悟空或八戒對象時,就實現這個介面,重寫方法創建你想要的對象。
interface Factory{ Air getAir(); } class WuKongFactory implements Factory{ @Override public Air getAir() { return new WuKong(); } } class BaJieFactory implements Factory{ public Air getAir() { return new BaJie(); } }
走筆至此,工廠方法設計模式的理解,我也就只能講這麼多,由於開發經驗太單薄,而且我也處於正在學習Java的階段,所以我沒能舉出在實際項目中運用這種模式的鮮活案例(有用到這種模式的朋友們希望能分享一下)。不過,這種模式的理解之後,還是比較簡單的,繞的彎也就那麼一道而已。同時,我在繼續看這本書時,以後也會多寫博客,整理一下心得,與大家共用。