設計模式:學習筆記(3)——簡單工廠模式

設計模式:學習筆記(3)——簡單工廠模式

簡單工廠模式

  我們都知道工廠是根據產品類的圖紙生產產品的。簡單工廠模式中,一個工廠類處於對產品實例化的中心位置上,它知道每一個產品,他決定哪一個產品類應當被示例化

  簡單工廠模式允許客戶端相對獨立於產品創建的過程,並且在系統引入新產品的時候無需修改客戶端,但是需要修改工廠類,將必要邏輯加入到工廠類中

  

  簡單工廠模式包括如下角色:

  • Factory:工廠角色
    • 負責創建具體的產品  
  • Product:抽象產品角色
  • ConcreteProduct:具體產品角色

說明:簡單工廠模式又稱爲靜態工廠方法模式,屬於類創建模式。

模式分析

模式應用

  JDK類庫中廣泛使用了簡單工廠模式,如工具類java.text.DateFormat,它用於格式化一個本地日期或者時間。

    private static DateFormat get(LocaleProviderAdapter adapter, int timeStyle, int dateStyle, Locale loc) {
        DateFormatProvider provider = adapter.getDateFormatProvider();
        DateFormat dateFormat;
        if (timeStyle == -1) {
            dateFormat = provider.getDateInstance(dateStyle, loc);
        } else {
            if (dateStyle == -1) {
                dateFormat = provider.getTimeInstance(timeStyle, loc);
            } else {
                dateFormat = provider.getDateTimeInstance(dateStyle, timeStyle, loc);
            }
        }
        return dateFormat;
    }

優缺點

  簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜

 

實例

//抽象圖表接口:抽象產品類  
interface Chart {  
    public void display();  
}  

//柱狀圖類:具體產品類  
class HistogramChart implements Chart {  
    public HistogramChart() {  
        System.out.println("創建柱狀圖!");  
    }  

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

//餅狀圖類:具體產品類  
class PieChart implements Chart {  
    public PieChart() {  
        System.out.println("創建餅狀圖!");  
    }  

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

//折線圖類:具體產品類  
class LineChart implements Chart {  
    public LineChart() {  
        System.out.println("創建折線圖!");  
    }  

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

//圖表工廠類:工廠類  
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;  
    }  
}

 參考資料

 

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