圖1 工廠模式【點擊查看大圖】編程
在面向對象編程中, 最一般的方法是一個new操做符產生一個對象實例,new操做符就是用來構造對象實例的。可是在一些狀況下, new操做符直接生成對象會帶來一些問題。舉例來講, 許多類型對象的創造須要一系列的步驟: 你可能須要計算或取得對象的初始設置; 選擇生成哪一個子對象實例; 或在生成你須要的對象以前必須先生成一些輔助功能的對象。 在這些狀況,新對象的創建就是一個 「過程」,不只是一個操做,像一部大機器中的一個齒輪傳動。
設計模式
自產自用,須要什麼東西本身動手作的田園經濟。網絡
輔助函數:ide
package com.cnblogs.mufasa.Demo2; public interface IMessage { final static String VALUE="接口中的常量數據"; public void send(); public void send(String message); } public interface IService { public void service(); } public class NetMessage implements IMessage { private String message; public NetMessage(){ this.message="無參構造"; } public NetMessage(String message){ this.message=message; } public void send() { System.out.println(this.message+"。。。輸出"); } public void send(String str) { System.out.println(str+this.getVALUE()); } public String getVALUE(){ return this.VALUE; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
非工廠的對象實例化:函數
package com.cnblogs.mufasa.Demo2; public class Demo1 { public static void main(String[] args) throws Exception { IMessage msg=new NetMessage("成功");//若是直接實例化必定會有 msg.send(); msg.send("hello"); } } /*輸出 【網絡消息發送】www.cnblogs.com */
市場經濟的初級階段,這個工廠只能生產特定不變的東西。【靜態工廠】this
package com.cnblogs.mufasa.Demo2; /** * 靜態工廠類:添加新的子類須要追加修改,標記 */ public class Factory { private Factory(){}//沒有產生實例化對象的意義,因此構造方法私有化 public static IMessage getInstance(String className){ if("netmessage".equalsIgnoreCase(className)){ return new NetMessage(); } return null; } }
簡單工廠實例化:spa
package com.cnblogs.mufasa.Demo2; public class Demo2 { public static void main(String[] args) throws Exception { IMessage msg=Factory.getInstance("NetMessage");//標準的工廠設計模式 msg.send(); } } /*輸出 【網絡消息發送】www.cnblogs.com */
package com.cnblogs.mufasa.demo1; import com.cnblogs.mufasa.demo1.IMessage; public interface IFactory { IMessage getInstance(); } class FactoryNetMessage implements IFactory{ @Override public NetMessage getInstance() { return new NetMessage(); } }
package com.cnblogs.mufasa.demo1; public class Demo1 { public static void main(String[] args) { FactoryNetMessage factoryNetMessage=new FactoryNetMessage(); NetMessage netMessage=factoryNetMessage.getInstance(); netMessage.send("工廠方法-"); } }
將功能進行細分.net
package com.cnblogs.mufasa.Demo3; public interface IFactory { public IMessage getMessage(); public IService getService(); } class Factory1 implements IFactory{ @Override public IMessage getMessage() { return new NetMessage(); } @Override public IService getService() { return new HouseService(); } } class Factory2 implements IFactory{ @Override public IMessage getMessage() { return new NetMessage(); } @Override public IService getService() { return new HouseService(); } }
package com.cnblogs.mufasa.demo2; //反射實現的動態工廠類 public class Factory2 { private Factory2(){} public static IMessage getInstance(String className) throws Exception { IMessage instance=null; try{//動態工廠類 instance=(IMessage) Class.forName(className).getDeclaredConstructor().newInstance(); }catch (Exception e){ e.printStackTrace(); } return instance; } }
package com.cnblogs.mufasa.demo2; public class Factory3 { private Factory3(){} /** * 獲取接口實例化對象 * @param className 接口的子類 * @param tClass 描述的是一個接口的類型 * @param <T> 接口的類型【泛型】 * @return 若是子類存在則返回指定接口的實例化對象 * @throws Exception */ public static <T> T getInstance(String className,Class<T> tClass) throws Exception { T instance=null; try{//動態工廠類 instance=(T) Class.forName(className).getDeclaredConstructor().newInstance(); }catch (Exception e){ e.printStackTrace(); } return instance; } }
原文連接:https://blog.csdn.net/jason0539/article/details/23020989設計
原文連接:https://blog.csdn.net/jason0539/article/details/44976775code