看一個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