工廠方法模式:讓父類在不知道具體實現的狀況下成本身功能的調用。實現方法是經過子類繼承父類的抽象方法來獲取被調用子類。(這裏有些DI的味道)html
優點:一、能夠在不知道具體調用和實現的狀況下進行編程java
二、更加容易擴展新版本編程
劣勢:一、在客戶端須要和具體的產品對象進行耦合,在調用處必需要知道須要調用的具體類。(能夠組合簡單工廠模式避免)設計模式
示例說明: 客戶端要進行文件導出,文件的類型有多種,這裏只簡單的列出兩種txt和DB類型。ExportFileOperator是不知道具體要對那種文件進行導出的,只ide
有客戶端在進行調用的時候才知掉要對哪一種類型文件進行導出。post
類圖以下:測試
下面看具體實現代碼:url
ExportFileApi:定義全部文件的標準,必須有export(File file)方法。spa
package com.zpj.designMode.FactoryMethodPattern; import java.io.File; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:10:46 * @version :1.1 * */ public interface ExportFileApi { public void export(File file); }
ExportDBFile:DB文件導出實現類設計
package com.zpj.designMode.FactoryMethodPattern; import java.io.File; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:12:35 * @version :1.1 * */ public class ExportDBFile implements ExportFileApi { @Override public void export(File file) { System.out.println("-------開始導出DB文件---------"); } }
ExportTxtFile:txt文件導出實現類
package com.zpj.designMode.FactoryMethodPattern; import java.io.File; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:12:35 * @version :1.1 * */ public class ExportTxtFile implements ExportFileApi { @Override public void export(File file) { System.out.println("-------開始導出txt文件---------"); } }
ExportFileOperator:由客戶端直接調用的導出操做類,在原本中不實現導出操做,由其子類具體實現。
package com.zpj.designMode.FactoryMethodPattern; import java.io.File; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:14:25 * @version :1.1 * */ public abstract class ExportFileOperator { public void export(File file){ ExportFileApi efa = FactoryMethod();//獲取須要導出的文件類型 efa.export(file);//調用自身的export()進行導出操做 } public abstract ExportFileApi FactoryMethod(); }
ExportDBFileOperator:繼承public abstract ExportFileApi FactoryMethod();,向調用處返回ExportDBFile類型對象
package com.zpj.designMode.FactoryMethodPattern; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:18:46 * @version :1.1 * */ public class ExportDBFileOperator extends ExportFileOperator{ @Override public ExportFileApi FactoryMethod() { return new ExportDBFile(); } }
ExportTxtFileOperator:繼承public abstract ExportFileApi FactoryMethod();,向調用處返回ExportTxtFile類型對象
package com.zpj.designMode.FactoryMethodPattern; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:18:46 * @version :1.1 * */ public class ExportTxtFileOperator extends ExportFileOperator{ @Override public ExportFileApi FactoryMethod() { return new ExportTxtFile(); } }
ClientTest:客戶端進行調用導出文件。
package com.zpj.designMode.FactoryMethodPattern; import java.io.File; import org.junit.Test; /** * @author PerKins Zhu * @date:2016年8月28日 上午10:21:50 * @version :1.1 * */ public class ClientTest { File file = new File("G:\\test\\test.txt"); //版本1測試 @Test public void test01(){ //這裏能夠根據須要導出的文件實例化相應的operator對象 ExportFileOperator txtFileOperator = new ExportTxtFileOperator(); txtFileOperator.export(file); ExportFileOperator DBFileOperator = new ExportDBFileOperator(); DBFileOperator.export(file); //在這裏能夠和簡單工廠模式進行組合,根據配置文件或者參數實例化不一樣的operator,見:http://www.cnblogs.com/PerkinsZhu/p/5813644.html } }
若是須要添加xml文件類型,需添加一個ExportFileApi的實現類 ExportXMLFile,實現自身的導出操做 export(File file);
一個ExportFileOperator的子類ExportXMLFileOperator,實現ExportXMLFile的調用方法public ExportFileApi FactoryMethod() 。
這樣在客戶端處便可對xml文件進行調用。
若是在調用處整合工廠方法模式便可經過參數或者配置文件來下降耦合度。見:設計模式—簡單工廠
* *----------Dragon be here!----------/ * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ┃ ┳┛ ┗┳ ┃ * ┃ ┃ * ┃ ┻ ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃神獸護體,Code is far away from bug with the animal protecting * ┃ ┃代碼無BUG! * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ * ━━━━━━神獸出沒━━━━━━