每天一個設計模式-5 工廠方法模式 1.模式定義 定義一個用於創建對象的介面,讓子類決定實例化那一個類,Factory Method使一個類的實例化延遲到其子類。 2.工廠方法模式解決問題的思路 工廠方法模式需要介面對象,那就定義一個方法來創建這個介面對象(工廠方法);可是事實上它自己是不知道如何創 ...
每天一個設計模式-5 工廠方法模式
1.模式定義
定義一個用於創建對象的介面,讓子類決定實例化那一個類,Factory Method使一個類的實例化延遲到其子類。
2.工廠方法模式解決問題的思路
工廠方法模式需要介面對象,那就定義一個方法來創建這個介面對象(工廠方法);可是事實上它自己是不知道如何創建這個介面對象的,沒有關係,定義成抽象方法讓子類來實現就可以了;這樣這個對象本身就可以只是面向介面編程,而無需關心到底如何創建介面對象了。
3.實際問題
實現一個導出數據的功能,客戶選擇數據的導出格式,根據客戶選擇的導出格式自動導出格式正確的數據。
4.類圖
5.源代碼
//抽象類 public abstract class ExportOpera { public ExportOpera(){ } public void finalize() throws Throwable { } /** * * @param data */ //這裡的返回類型也可以是一個具體對象 public boolean export(String data){ //通過調用工廠方法,實例化需要的對象 ExportFlieApi exportFlieApi = factoryMethod(); //調用ExportFlieApi介面的export方法 return exportFlieApi.export(data); } //這裡是抽象方法,由子類來實現 protected abstract ExportFlieApi factoryMethod(); }ExportOpera
public interface ExportFlieApi { /** * * @param data */ public boolean export(String data); }ExportFileApi
public class ExportTxtFlie implements ExportFlieApi { public ExportTxtFlie(){ } public void finalize() throws Throwable { } /** * * @param data */ public boolean export(String data){ System.out.println("以TXT格式導出數據"+data); return true; } }ExportTxtFlie
public class ExportDBFlile implements ExportFlieApi { public ExportDBFlile(){ } public void finalize() throws Throwable { } /** * * @param data */ public boolean export(String data){ System.out.println("以DB格式導出數據"+data); return true; } }ExportDBFlile
//ExportOpera的子類之一 public class ExportTxtFileOperate extends ExportOpera { public ExportTxtFileOperate(){ } public void finalize() throws Throwable { super.finalize(); } protected ExportFlieApi factoryMethod(){ System.out.println("在子類中創建了"+this.getClass().getName()); return new ExportTxtFlie(); } }ExportTxtFileOperate
//Export的子類之一 public class ExportDBFileOperate extends ExportOpera { public ExportDBFileOperate(){ } public void finalize() throws Throwable { super.finalize(); } protected ExportFlieApi factoryMethod(){ System.out.println("在子類中創建了"+this.getClass().getName()); return new ExportDBFlile(); } }ExportDBFileOperate
public class Client { public static void main(String[] args) { ExportOpera eo = new ExportTxtFileOperate();//選擇一種輸出格式 eo.export("測試數據"); ExportOpera eo2 = new ExportDBFileOperate(); eo2.export("測試數據"); } }Client
6.測試結果
在子類中創建了ExportTxtFileOperate
以TXT格式導出數據測試數據
在子類中創建了ExportDBFileOperate
以DB格式導出數據測試數據
7.模式講解
工廠方法模式的主要功能就是讓父類在不知道具體實現的情況下,完成自身的調用;而具體的實現延遲到子類來實現。
一般工廠方法返回的是被創建對象的介面對象,當然也可以是抽象類或者一個具體類的實例。
參數化工廠方法:通過給工廠方法傳遞參數,讓工廠方法根據參數的不同來創建不同的產品對象,這種情況就被稱為參數化工廠方法。當然工廠方法創建的不同的產品必須是同一個Product類型的。源代碼就不寫了,只是給factory method方法加一個參數,根據參數創建不同的對象。
使用參數化工廠方法,擴展會變得非常容易。可以依靠繼承的特性,讓子類有選擇的覆蓋,不覆蓋的功能還可以返回去交給父類來實現(當然,你的父類要有預設的實現,此時的父類也已經抽象類了)
8.總結
工廠方法模式的本質就是:延遲到子類來選擇實現。
工廠方法模式中的工廠方法,在真正實現的時候,一般是先選擇具體使用哪一個具體的產品實現對象,然後創建這個具體產品對象的實例,最後就可以返回去了。也就是說,工廠方法本身並不會去實現產品介面,具體的產品實現是已經寫好的了,工廠方法只要去選擇實現就好了。
-------博主寫博客不容易,轉載請註明出處,謝謝:http://www.cnblogs.com/xiemubg/p/5957430.html