設計模式-簡單工廠模式

轉載請註明出處:https://blog.csdn.net/m0_37459380/article/details/83104977

定義

簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有共同的父類。因爲在簡單工廠模式中用於創建實例的方法是靜態(static)方法,因此簡單工廠模式又被稱爲靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。

1.簡單工廠模式提供了專門的工廠類用於創建對象,將對象的創建和對象的使用分離開,它作爲一種最簡單的工廠模式在軟件開發中得到了較爲廣泛的應用;

2.簡單工廠模式是工廠方法模式的“小弟”,它不屬於23種設計模式,但在軟件開發中應用也較爲頻繁,通常將它作爲學習其他工廠模式的入門;

3.簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。

簡介

應用實例

1.您需要一輛汽車,可以直接從工廠裏面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裏面的具體實現;
2.Hibernate 換數據庫只需換方言和驅動就可以。

使用場景

1.工廠類負責創建的對象比較少,由於創建的對象較少,不會造成工廠方法中的業務邏輯太過複雜;
2. 客戶端只知道傳入工廠類的參數,對於如何創建對象並不關心。

實現:圖標庫設計

公司欲基於Java語言開發一套圖表庫,該圖表庫可以爲應用系統提供各種不同外觀的圖表,例如柱狀圖、餅狀圖、折線圖等。設計人員希望爲應用系統開發人員提供一套靈活易用的圖表庫,而且可以較爲方便地對圖表庫進行擴展,以便能夠在將來增加一些新類型的圖表。

方案一

class Chart {
   private String type; //圖表類型
   
   public Chart(String type) {
   	this.type = type;
   	if (type.equalsIgnoreCase("histogram")) {
   		System.out.println("初始化柱狀圖!");
   	}
   	else if (type.equalsIgnoreCase("pie")) {
   		System.out.println("初始化餅狀圖!");
   	}
   	else if (type.equalsIgnoreCase("line")) {
   		System.out.println("初始化折線圖!");
   	}
   }

   public void display() {
   	if (this.type.equalsIgnoreCase("histogram")) {
   		System.out.println("顯示柱狀圖!");
   	}
   	else if (this.type.equalsIgnoreCase("pie")) {
   		System.out.println("顯示餅狀圖!");
   	}
   	else if (this.type.equalsIgnoreCase("line")) {
   		System.out.println("顯示折線圖!");
   	}	
   }
}

分析以上代碼:

1:代碼“if else”代碼塊很多,代碼冗長,如果再多幾種類型,閱讀、維護、測試難度就會越複雜。

2:代碼集中,職責過重,違反了“單一職責原則”,不利於重用、維護和擴展。

3:在擴展的時候必須修改Chart類,違反了“開閉原則”。

4.客戶端只能通過new關鍵字來直接創建Chart對象,Chart類與客戶端類耦合度較高,對象的創建和使用無法分離。

5.客戶端在創建Chart對象之前可能還需要進行大量初始化設置,例如設置柱狀圖的顏色、高度等,如果在Chart類的構造函數中沒有提供一個默認設置,那就只能由客戶端來完成初始設置,這些代碼在每次創建Chart對象時都會出現,導致代碼的重複。

方案二(使用簡單工廠模式)

爲了將Chart類的職責分離,同時將Chart對象的創建和使用分離,重新對代碼進行了重構。

創建圖表接口

public interface Chart {

   /**
    * 展示圖表
    */
   void display();
}

創建圖表工廠

public class ChartFactory {
   //靜態工廠方法
   public static Chart getChart(String type) {
       Chart chart = null;
       if (type.equalsIgnoreCase("histogram")) {
           chart = new HistogramChart();
           System.out.println("初始化設置柱狀圖!");
       } else if (type.equalsIgnoreCase("pie")) {
           chart = new PieChart();
           System.out.println("初始化設置餅狀圖!");
       } else if (type.equalsIgnoreCase("line")) {
           chart = new LineChart();
           System.out.println("初始化設置折線圖!");
       }
       return chart;
   }
}

創建實現類

public class HistogramChart implements Chart {
   public HistogramChart() {
       System.out.println("創建柱狀圖!");
   }

   public void display() {
       System.out.println("顯示柱狀圖!");
   }
}
public class LineChart implements Chart {
   public LineChart() {
       System.out.println("創建折線圖!");
   }

   public void display() {
       System.out.println("顯示折線圖!");
   }
}
public class PieChart implements Chart {
   public PieChart() {
       System.out.println("創建餅狀圖!");
   }

   public void display() {
       System.out.println("顯示餅狀圖!");
   }
}

測試代碼

public class Main {

    public final static String CHART_HISTOGRAM = "histogram";
    public final static String CHART_PIE = "pie";
    public final static String CHART_LINE = "line";
    public static void main(String[] args) {
        //通過靜態工廠方法創建產品
        Chart chartHistogram = ChartFactory.getChart(CHART_HISTOGRAM);
        chartHistogram.display();

        Chart chartPie = ChartFactory.getChart(CHART_PIE);
        chartPie.display();

        Chart chartLine = ChartFactory.getChart(CHART_LINE);
        chartLine.display();
    }
}

輸出如下

創建柱狀圖!
初始化設置柱狀圖!
顯示柱狀圖!
創建餅狀圖!
初始化設置餅狀圖!
顯示餅狀圖!
創建折線圖!
初始化設置折線圖!
顯示折線圖!

分析以上代碼:在測試類中,我們使用工廠類的靜態方法來創建對象,如果需要更換其他圖表,只需要修改參數即可。

改進:上述代碼還存在一個問題,在每次客戶端更換靜態工廠中的參數時,客戶端代碼都需要重新編譯,對客戶端而言,違反了“開閉原則”,怎麼能在修改參數時不需要修改客戶端代碼呢?
我們只需要參數放入配置文件即可。如果需要修改具體圖表參數,只需要修改配置文件,無需修改任何源代碼,符合“開閉原則”。

總結

優點

1.一個調用者想創建一個對象,只要知道其名稱就可以了;

2.擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以;

3.屏蔽產品的具體實現,調用者只關心產品的接口;

4.實現了對象創建和使用分離;

5.通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。

缺點

1.由於工廠類集中了所有產品的創建邏輯,職責過重,一旦不能正常工作,整個系統都要受到影響;

2.每次增加一個產品時,都需要增加一個具體類和對象實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴;

3.簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。

感謝您的閱讀,如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕。本文歡迎各位轉載,但是轉載文章之後必須在文章開頭給出原文鏈接。

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