設計模式入門之工廠方法模式FactoryMethod

N天之後,終於看懂這個模式了...我發現我在沒有學會1+1之前,先去玩兒1+2去了...

//工廠方法模式定義:定義一個用於創建對象的接口,讓子類決定實例化哪一個類,FactoryMethod使一個類都實例化延遲到其子類
//之前一直沒有理解這個模式爲什麼要這麼做
//首先感受下沒有用工廠方法模式的情況
public class ExportFileApi {
	public boolean export(String data);
}
public class ExportTxtFile extends ExportFileApi {
	public boolean export(String data) {
		System.out.println("成功導出"+data+"到Txt文件");
		return true;
	}
}
public class ExportDbFile extends ExportFileApi {
	public boolean export(String data) {
		System.out.println("成功功導出"+data+"到Db文件");
		return false;
	}
}
public class Client {
	public static void main(String[] args) {
		ExportFileApi exp = new ExportTxtFile();
		exp.export("測試數據");
	}
}
//還是感覺沒有用工廠方法模式挺好的...(之後又看了下書的開頭有這樣一句話:面向接口編程,系統外部不應該知道或瞭解具體實現(實現類))
//這樣一看貌似理解了一點這個模式了
//======================================================
//再來看看用了工廠方法模式的情況
public abstract class ExportOperate {
	public boolean export(String data) {
		ExportFileApi api = factoryMethod();
		return api.export(data);
	}
	protected abstract ExportFileApi factoryMethod();
}
//這裏用到了抽象類,至於原因,應該是書中的這句話吧(1.優先使用接口,2.當只需要定義子類都行爲時用接口,又要爲子類提供公共的功能時用抽象類)
//很明顯export方法就是子類的公共方法(應該就是這個意思吧)
public class ExportTxtFileOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
		return new ExportTxtFile();
	}
}
public class ExportDbFileOperate extends ExportOperate {
	protected ExportFileApi factoryMethod() {
		return new ExportDbFile();
	}
}
public class Client {
	public static void main(String[] args) {
		ExportOperate operate = new ExportDbFileOperate();
		operate.export("測試數據");
	}
}
//這下再看客戶端(即系統外部),實例化的只是一個操作對象,而不是具體都實現對象了
//一步一步按照一些原則用自己的思路和方法實現了一下,經過一次次抽象,最終跟上邊都工廠方法很相似
//感覺工廠方法模式應用應該非常廣泛
//本來到此可以結束了,再次看看看參數化工廠方法,突然蒙了
public class ExportOperate {
	public boolean export(int type,String data) {
		ExportFileApi api = factoryMethod(type);
		return api.export(data);
	}
	protected ExportFileApi factoryMethod(int type) {
		ExportFileApi api = null;
		if(type==1) {
			api = new ExportTxtFile();
		}else if(type==2) {
			api = new ExportDbFile();
		}
		return api;
	}
}
public class Client {
	public static void main(String[] args) {
		ExportOperate operate = new ExportOperate();
		operate.export(1,"測試數據");
	}
}
//我在自己實現都時候用到了這種方法,可是一味得去理解面向接口編程,結果覺得這樣是面向對象編程方法不好...
//沒想到這種方法美其名曰 參數化工廠方法
//到這裏突然又理解類工廠方法模式的本質---把具體實現延遲到子類當中,這樣的話以上這兩種方法都可以理解了
//另外,工廠方法模式很好地體現類“依賴倒置原則”,依賴---要依賴抽象,不要依賴於具體類
//倒置---接口的所有權倒置到高層組件中去了,因爲是高層組件提出的接口需求

//感覺這三個月的工作假期太值了,在廈門大學這樣一個非常有學習氛圍的地方跟學生們一起學習
//只有離開了學校才知道學校的好,真的,在學校真好,好想回到從前
//讓我能夠把以前在學校沒有好好學的知識多多少少補回來一些,很幸運,很感激


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