java設計模式——工廠模式

工廠模式——簡單工程模式

  1. 簡介:
    定義了一個創建對象的類,由這個類來封裝實例化對象的行爲。
    工廠模式類圖

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

  3. 優缺點
    優點
    工廠類含有必要的判斷邏輯,可以決定在什麼時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅“消費產品”;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用於創建對象。
    客戶端無需知道所創建的具體產品類的類名,只需知道具體產品類所對應的參數即可,對於一些複雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
    通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
    缺點
    實際開發中,很多產品是一個多層次的樹狀結構,由於簡單工廠模式中只有一個工廠類對應這些產品,所以可能會把我們的客戶端累壞。
    由於工廠類集中了所有類的創建邏輯,一旦不能正常工作,整個系統都會受到影響。
    系統擴展困難,一旦添加新的產品,必須要修改工廠邏輯,在產品類型較多時,有可能造成工廠邏輯過於複雜,不利於系統的擴展和維護。
    簡單工廠模式由於使用了靜態工廠方法,造成了工廠角色無法形成基於繼承的等級結構。

  4. 使用場景
    有一組類似的對象需要創建(業務簡單)
    一般用於小項目或者具體產品很少擴展的情況
    客戶端只知道傳入工廠類的參數,對於如何創建對象不關心;客戶端既不需要關心具體創建細節,甚至連類名都不需要記住,只需知道類型所對應的參數。

    案例(四則運算表)

    1.如果要求你用java寫一九九乘法表,相信大多數人不會有問題,而且很有可能都這樣寫:

public class MultiTableTest_1 {
   public static void main(String[] args){
       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.不錯,這樣寫確實簡潔,算法也不錯,但是要注意java是一種什麼樣的語言,它有什麼樣的特性。對,java是一種面向對象的語言,它的特性是封裝、繼承、多態。如果不想將結果顯示到屏幕上呢,那麼就必須修改代碼了,顯然這樣寫不易複用、擴展`。那麼想想後這樣寫:


public class MultiTableTest_1 {
   public static void MultiTable(){
       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();
       }
   }   
}

3.確實這樣寫,體現了java面向對象的思想以及封裝,想在哪兒顯示,只需調用即可,而且做到了界面邏輯與業務邏輯的分離。這裏我們實現的是乘法表,若我想做加法表、除法表、減法表呢?CTRL+C或者CTRL+V顯然不是好方法,那麼看看用到繼承與多態的實現方式:

抽象產品角色:LowTable



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

具體產品角色1:Multiplica
乘法


 ```

    public class Mutiplication 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\t",j,i,i*j));
           }
           System.out.println();
       }
 }
}

4.下面看看偉大的簡單工廠方法
添加一個工廠類,用來實例化對象
工廠類角色:LowTableFactory

 public class LowTableFactory {
public  static LowTable TableFactory(String op){
    switch (op) {
    case "+":
        return new Addition();

    case "*":
        return new Mutiplication();

    }
    return null;
 }
}

那麼客戶端使用如下:

public class ClientFactoryUse {
    public static void main(String[] args) {
       LowTable lowtable= LowTableFactory.TableFactory("*");
       lowtable.low();
    }

}

至此,我們看到了簡單工廠設計模式的很多好處,用戶無需關心怎麼創建,只要提供參數即可;程序的可擴展性也增強。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章