看一个Demo,有一个接口UserService,两个实现类UserServiceImpl,UserServiceImpl2java
package cn.demo; public interface UserService { public abstract void findUsers(); } package cn.demo public class UserServiceImpl implements UserService { @Override public void findUsers() { System.out.println("查找全部用户..."); } } package cn.demo public class UserServiceImpl2 implements UserService { @Override public void findUsers() { System.out.println("查找全部用户并排序..."); } }
package cn.demo public class FactoryTest { public static void main(String[] args) { UserService userService = new UserServiceImpl(); // UserService userService = new UserServiceImpl2(); userService.findUsers(); } }
当咱们使用实现类UserServiceImpl时,须要在代码中使用new关键字建立,当咱们想使用实现类UserServiceImpl2时,不得不更改代码,使用new关键字建立UserServiceImpl2的实例。下面看工厂模式的作法ide
工厂类code
package cn.demo.utils; import java.util.ResourceBundle; public class MyFactoryUtils { @SuppressWarnings("all") public static <T> T getInstance(Class<T> c) { // 获取接口类名 String interfaceName = c.getSimpleName(); // 加载配置文件,获取接口实现类的包名.类名 ,ResourceBundle用于读取src目录下的properties文件 String interfaceImplName = ResourceBundle.getBundle("myinterface").getString(interfaceName); // 返回实例对象 try { return (T) Class.forName(interfaceImplName).newInstance(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e + "加载接口实例失败"); } } }
同时在src目录下建立myinterface.properties文件,并配置对象
UserService=cn.demo.UserServiceImpl
使用排序
package cn.demo; public class FactoryTest { public static void main(String[] args) { UserService userService = MyFactoryUtils.getInstance(UserService.class); userService.findUsers(); } }
这样若是想使用另外一个实现类,只须要更改配置文件就能够了接口
UserService=cn.demo.UserServiceImpl2