package cn.telling.factory;/** * 工厂类,用来创建API对象 * @ClassName: Api * TODO * @author xingle * @date 2015-10-28 下午4:27:45 */public interface Api { public void opration(String s);}
package cn.telling.factory;/** * 接口具体实现对象A * @ClassName: ImplA * TODO * @author xingle * @date 2015-10-28 下午4:30:23 */public class ImplA implements Api{ /** * * @Description: TODO * @param s * @author xingle * @data 2015-10-28 下午4:30:32 */ @Override public void opration(String s) { System.out.println("ImplA s=="+s); }}
package cn.telling.factory;/** * 接口具体实现对象B * @ClassName: ImplB * TODO * @author xingle * @date 2015-10-28 下午4:40:15 */public class ImplB implements Api{ /** * * @Description: TODO * @param s * @author xingle * @data 2015-10-28 下午4:40:25 */ @Override public void opration(String s) { System.out.println("ImplB s=="+s); }}
配置文件用最简单的properties文件,实际开发中多是xml配置。定义一个名称为“FactoryTest.properties”的配置文件,放置到factory同一个包下面,内容如下:
ImplAClass=cn.telling.factory.ImplAImplBClass=cn.telling.factory.ImplB
工厂类实现如下:
package cn.telling.factory;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/** * 工厂类 * @ClassName: Factory TODO * @author xingle * @date 2015-10-28 下午4:31:52 */public class Factory { /** * 具体的创造Api的方法,根据配置文件的参数来创建接口 * * @return 创造好的Api对象 */ public static Api createApi(String type) { // 直接读取配置文件来获取需要创建实例的类 // 至于如何读取Properties,还有如何反射这里就不解释了 Properties p = new Properties(); InputStream in = null; try { in = Factory.class.getResourceAsStream("FactoryTest.properties"); p.load(in); } catch (IOException e) { System.out.println("装载工厂配置文件出错了,具体的堆栈信息如下:"); e.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } // 用反射去创建,那些例外处理等完善的工作这里就不做了 Api api = null; try { if("A".equals(type)){ api = (Api) Class.forName(p.getProperty("ImplAClass")).newInstance(); }else if("B".equals(type)){ api = (Api) Class.forName(p.getProperty("ImplBClass")).newInstance(); } } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return api; }}
客户端程序:
package cn.telling;import cn.telling.factory.Api;import cn.telling.factory.Factory;/** * * @ClassName: Client * TODO * @author xingle * @date 2015-10-28 下午4:36:58 */public class Client { public static void main(String[] args) { Api api = Factory.createApi("B"); api.opration("哈哈,不要紧张,只是个测试而已!"); }}
执行结果: