工廠三兄弟之簡單工廠模式(一)

Liuwei-Sunny發表於2013-07-11

       工廠模式是最常用的一類建立型設計模式,通常我們所說的工廠模式是指工廠方法模式,它也是使用頻率最高的工廠模式。本章將要學習的簡單工廠模式是工廠方法模式的“小弟”,它不屬於GoF 23種設計模式,但在軟體開發中應用也較為頻繁,通常將它作為學習其他工廠模式的入門。此外,工廠方法模式還有一位“大哥”——抽象工廠模式。這三種工廠模式各具特色,難度也逐個加大,在軟體開發中它們都得到了廣泛的應用,成為物件導向軟體中常用的建立物件的工具。

 

1 圖表庫的設計

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

       Sunny軟體公司圖表庫設計人員提出了一個初始設計方案,將所有圖表的實現程式碼封裝在一個Chart類中,其框架程式碼如下所示:

class Chart {
	private String type; //圖表型別
	
	public Chart(Object[][] data, String type) {
		this.type = type;
		if (type.equalsIgnoreCase("histogram")) {
			//初始化柱狀圖
		}
		else if (type.equalsIgnoreCase("pie")) {
			//初始化餅狀圖
		}
		else if (type.equalsIgnoreCase("line")) {
			//初始化折線圖
		}
	}

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


       客戶端程式碼通過呼叫Chart類的建構函式來建立圖表物件,根據引數type的不同可以得到不同型別的圖表,然後再呼叫display()方法來顯示相應的圖表。

       不難看出,Chart類是一個“巨大的”類,在該類的設計中存在如下幾個問題:

       (1) Chart類中包含很多“if…else…”程式碼塊,整個類的程式碼相當冗長,程式碼越長,閱讀難度、維護難度和測試難度也越大;而且大量條件語句的存在還將影響系統的效能,程式在執行過程中需要做大量的條件判斷。

       (2) Chart類的職責過重,它負責初始化和顯示所有的圖表物件,將各種圖表物件的初始化程式碼和顯示程式碼集中在一個類中實現,違反了“單一職責原則”,不利於類的重用和維護;而且將大量的物件初始化程式碼都寫在建構函式中將導致建構函式非常龐大,物件在建立時需要進行條件判斷,降低了物件建立的效率。

       (3) 當需要增加新型別的圖表時,必須修改Chart類的原始碼,違反了“開閉原則”。

       (4) 客戶端只能通過new關鍵字來直接建立Chart物件,Chart類與客戶端類耦合度較高,物件的建立和使用無法分離。

       (5) 客戶端在建立Chart物件之前可能還需要進行大量初始化設定,例如設定柱狀圖的顏色、高度等,如果在Chart類的建構函式中沒有提供一個預設設定,那就只能由客戶端來完成初始設定,這些程式碼在每次建立Chart物件時都會出現,導致程式碼的重複。

       面對一個如此巨大、職責如此重,且與客戶端程式碼耦合度非常高的類,我們應該怎麼辦?本章將要介紹的簡單工廠模式將在一定程度上解決上述問題

 

      為什麼要引入工廠類,大家可參見:建立物件與使用物件——談談工廠的作用

 

【作者:劉偉 http://blog.csdn.net/lovelion

相關文章