趣味設計模式之工廠模式
一開始的時候,我覺得設計模式不是很重要,因為在工作的過程中,處理起來大多數是業務的邏輯,好像也是隻有在面試的時候有作用,正所謂“面試造火箭,進門當螺絲”。但是隨著自己的不斷深入的理解,閱讀一些好的專案的原始碼的時候才發現心有餘,而力不足。當自己需要設計一個系統的時候也有很多的地方沒有考慮到。然後這個時候才感覺到設計模式的好處。
但是當自己認真去學的時候才發現設計模式很難讓人理解如果專案經驗不是很足的情況下,就算是憑著一時的興趣,強行的去學的話,儘管確實是可以死記住一些簡單的設計模式,但是對於使用的場景的話又會用不上,感覺又沒有真正的理解,於是,我自己在想,能不能找到一種比較好玩又好記的方式來讓自己可以理解好設計模式,因為有23種之多。功夫不負有心人,似乎自己找到了適合自己學習的方式,於是就總結起來,分享給大家,希望大家也可以從中找到適合自己的方式。
閒話不多說,提筆開講。因為要好玩,我第一時間就想到了西遊記,感覺有很多種模式都可以結合起來說。
對於一些理論上的知識,我就不多說,詳細的可以百度瞭解下。
首先,學習東西的時候,我們必須清楚明白它的意圖或者說作用,正如唐三藏去西天取經。他的目的就是去取經的,但是憑藉他自己的力量去取經的話,感覺不太可行,於是他需要幫手,這個時候就該我們熟悉的悟空、八戒、沙僧、以及白龍馬出場了。然後我們通過圖的方式細劃分下:
通過上圖,我們可以清楚的知道,為了給唐僧成功的取經,悟空這些才會上產出來,所以我們可以這樣理解,工廠就是用來建立物件的,也就是說這兩種設計模式都屬於建立型的設計模式。
假如現在你就是唐三藏,但是不好意思的是現實中沒有眾多仙家,所以為了找到幫手我們就需要自己建立一些幫手,所以自己動手,豐衣足食。下面我就通過程式碼來實現產出幫手的工廠:
(1)第一步,定義一個幫手介面:
/**
* 幫手的介面
* */
public interface Bangshou {
/**
* 用來說明是誰
* */
void whoAmI();
}
(2)第二步,定義好悟空、八戒這些幫手
public class WuKong implements Bangshou{ @Override public void whoAmI() { System.out.println("我是齊天大聖孫悟空!"); } }
public class Bajie implements Bangshou{
@Override
public void whoAmI() {
System.out.println("我是天蓬元帥豬八戒!");
}
}
(3)第三步,實現我們的工廠
public class BangshouFactory {
/**
* 這裡就生產工廠的方法,如果不喜歡使用if,也可以採用switch
* 或者採用map等等,過程實現有很多,可以自己擴充套件,who的null判斷記得
* */
public static Bangshou productBangshou(String who) {
if("WUKONG".equalsIgnoreCase(who)) {
return new WuKong();
}
if("BAJIE".equalsIgnoreCase(who)) {
return new Bajie();
}
if("BAILONGMA".equalsIgnoreCase(who)) {
return new Bailongma();
}
if("SHASENG".equalsIgnoreCase(who)) {
return new Shaseng();
}
return null;
}
}
(4)第四步,測試是否達到了我們的效果
public class Test {
public static void main(String[] args) {
Bangshou b = BangshouFactory.productBangshou("WUKONG");
b.whoAmI();
Bangshou c = BangshouFactory.productBangshou("bajie");
c.whoAmI();
}
}
(5)效果圖如下:
這個過程就是工廠模式的實現了,是不是好理解了點?唐三藏就憑藉著它自己設計的工廠,找到滿意的幫手之後就出發了,但是取經哪有那麼容易,很多的時候憑藉他們根本就對付不了的一些個別的妖怪,還得找第三方幫手啊!!!
於是唐三藏又在想,怎麼辦呢?這個工廠貌似弱了些,突然間抽象工廠模式在他的腦海裡出現,那麼抽象工廠又怎麼實現呢?
不要錯過,感興趣的話,歡迎檢視下節,下節更精彩!