四則運算法則表 - 簡單工廠模式

簡單工廠模式

簡介

定義一個建立對象的類,由這個類來封裝實例化對象的行爲java

輸入圖片說明

組成角色

  • 工廠類角色:這是本模式的核心,含有必定的商業邏輯和判斷邏輯,根據邏輯不一樣,產生具體的工廠產品。
  • 抽象產品角色:它通常是具體產品繼承的父類或者實現的接口。由接口或者抽象類來實現。
  • 具體產品角色:工廠類所建立的對象就是此角色的實例。

優缺點

  • 優勢程序員

    • 工廠類含有必要的判斷邏輯,能夠決定在何時建立哪個產品類的實例,客戶端能夠免除直接建立產品對象的責任,而僅僅「消費」產品;簡單工廠模式經過這種作法實現了對責任的分割,它提供了專門的工廠類用於建立對象。
    • 客戶端無須知道所建立的具體產品類的類名,只須要知道具體產品類所對應的參數便可,對於一些複雜的類名,經過簡單工廠模式能夠減小使用者的記憶量。
    • 經過引入配置文件,能夠在不修改任何客戶端代碼的狀況下更換和增長新的具體產品類,在必定程度上提升了系統的靈活性。
  • 缺點面試

    • 實際開發中,不少產品是一個多層次的樹狀結構,因爲簡單工廠模式中只有一個工廠類來對應這些產品,因此可能會把咱們的客戶端累壞
    • 因爲工廠類集中了全部產品建立邏輯,一旦不能正常工做,整個系統都要受到影響。
    • 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,在產品類型較多時,有可能形成工廠邏輯過於複雜,不利於系統的擴展和維護。
    • 簡單工廠模式因爲使用了靜態工廠方法,形成工廠角色沒法造成基於繼承的等級結構。

適用場景

  • 有一組相似的對象須要建立(業務簡單)
  • 通常用於小項目或或者具體產品不多擴展的狀況
  • 客戶端只知道傳入工廠類的參數,對於如何建立對象不關心:客戶端既不須要關心建立細節,甚至連類名都不須要記住,只須要知道類型所對應的參數。

案例

四則運算表

小鳥:「牛哥,好奇怪啊,我那天面試時,面試官只讓我寫了一個九九乘法表,我感受本身寫的ok啊!怎麼還沒通知我去上班捏?」算法

大牛:「是嗎?你怎麼寫的啊?」ide

小鳥:「你看,這是個人代碼,難道還有更簡單的實現方式嗎?」測試

public class Test {
    public static void main(String[] arrays) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(String.format("%d*%d=%d\t", j, i, i * j));
            }
            System.out.println("");
        }
    }
}

大牛:「你的代碼確實挺簡潔的,算法也用的不錯,可是你有沒有想過,爲何只讓你寫這樣一個效果呢?有點程序基礎的,都知道這麼寫,很明顯,這樣的話,不能區分大家的水平,既然如此,那他爲啥還要這樣出呢?是無聊,是想報復公司,隨便找些人去應付boss,這裏的回答是否認的,那麼,你再想一想java是一種什麼樣的語言,它有什麼樣的特性?」ui

小鳥:「java是一種面向對象的語言,它的特性,地球人都知道:繼承、封裝、多態啊!」3d

大牛:「對啊!java是一種面向對象的語言,你這裏體現面向對象的思想了沒?繼承、封裝、多態這些特性用到了多少?」code

小鳥:「嗯~,貌似只是實現了簡單的算法,這些特性確實都沒用着耶!可是這裏也不必用這些啊?」orm

大牛:「我以爲顯示在電腦上面攜帶不方便,我想換到手機屏幕上去顯示,這樣攜帶方便,還能利用零散的時間隨時去記憶,多好!」

小鳥:「這還不簡單,直接將這個算法複製過去就好了,每個優秀的程序員,必先是一個偉大的CV戰士,拒絕重複製造輪子,能複製則複製。」

大牛:「小鳥,你這話算是說對了一半。」

小鳥:「哦!是嗎?那應該是?」

大牛:「複用,每個優秀的程序員,必先是一個偉大的CV戰士,拒絕重複製造輪子,能複用則複用。小鳥,你再想一想,當你在作一個大型的項目時,裏面有好多相同的功能,只是,展現出來的效果有點不一樣,這時你會想,這項目也太容易了,我寫好一個,改一下ui,而後就將它複製到其它地方就好了,複製,複製,複製到這,複製到那,都誰複製,太容易了,你很是興奮的,通宵達旦的就將全部功能開發完畢,而後準備上線,這時測試美美髮現了一個小bug。」

小鳥:「我會崩潰的,好不容易弄完,唉~,要改這麼多地方,累死寶寶了。」

大牛:「是呢!想一想就夠讓人抓狂的。小鳥,你再仔細想一想java的特性,以及我剛纔跟你說的複用。」

小鳥:「哦!我明白了,我們就以我此次面試爲例,我再給寫一個,你幫我看看。」

public class Multiplication {
    public static void mutiplicationTable() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {

                System.out.print(String.format("%d*%d=%d\t", j, i, i * j));
            }
            System.out.println("");
        }
    }
}

小鳥:「牛哥,我這裏將九九乘法表進行了封裝,就跟你以前說的,我要在哪顯示,我只須要引用它就行,至於顯示在哪,不用管,這樣的話,也就達到了一個複用的效果,不會再出現複製致使的災難了。」

大牛:「悟性不錯,這樣確實作到了界面邏輯與業務邏輯的分離。」

小鳥:「牛哥,java他有三大特性,可是我只用到了一種,封裝,你開始有跟我說過,這是[kao]3大特性,可是其它兩種,我確實想不到,它怎麼體現。」

大牛:「能思[kao],不錯!那好,再啓發你一下,你想一想,我這裏雖然只是乘法表,可是若是我想作加法表、除法表,減法表呢?」

小鳥:「這還不容易,我加一個參數,用來表示是加法、減法、仍是除法,而後在改一下for循環裏面的輸出,添加switch case就o了。」

大牛:「小鳥,你這思惟可就是計算機的思惟了,你再想一想,要是如今只要求你添加加法表,後來,要要求你添加減法表,你手一抖,不當心將之前的加法也改爲了減法,想一想最後的結果,越加越小,會不會嚇死寶寶呢?再想一想繼承,多態。 」

小鳥:「牛哥,這是我寫的代碼,這裏將繼承和多態都用上了,可是,我怎麼知道用戶何時要乘法表,何時要加法表呢?」 抽象產品角色:LowTable

public abstract class LowTable {
    public abstract void low();
}

具體產品角色1:Multiplication

乘法

public class Multiplication extends LowTable{

    @Override
    public void low() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(String.format("%d*%d=%d\t", j, i, i * j));
            }
            System.out.println("");
        }
    }
}

具體產品角色2:Addition

加法

public class Addition extends LowTable {
    @Override
    public void low() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {

                System.out.print(String.format("%d+%2d=%3d", j, i, i+j));

            }
            System.out.println("");
        }
    }
}

大牛:「不錯,不錯,真不錯,那就再教你一招,簡單工廠模式,在此基礎上,加一個工廠類,用來實例化對象,已解決你不知道用哪一個對象的疑惑。」 工廠類角色:LowTableFactory

public class LowTableFactory {
    public static LowTable createLowTable(String tableName) {
        switch (tableName) {
            case "*":
                return new Multiplication();

            case "+":
                return new Addition();
        }

        return new Multiplication();
    }
}

大牛:「看到了吧,只要輸入對應的運算符,就能找到對應的法則表對象,經過多態,調用父類的方法,便可獲得咱們的法則表」

客戶端使用

public static void main(String[] arrays) {
        LowTable lowTable = LowTableFactory.createLowTable("+");
        lowTable.low();
}

小鳥:「這麼說,我就明白了,我那天面試時,寫的乘法表,確實是計算機的思惟,原來一個小小的乘法表,中間還有這麼大的學問,也能夠寫得這麼精彩,謝謝你,牛哥!」

相關文章
相關標籤/搜索