图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