======== 通用工厂 ======== 1 更加通用的工厂类 在一个工厂类中,通过不同的工厂方法创建不同的实现类对象: public class BeanFactory { ... public static UserDao getUserDao() { UserDao userDao = null; try { userDao = (UserDao) Class.forName( properties.getProperty("userDao")).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return userDao; } public static UserService getUserService() { UserService userService = null; try { userService = (UserService) Class.forName( properties.getProperty("userService")).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return userService; } } 如果有更多的实现类,还需要再增加更多的创建方法,而且这些方法中大部分代码都是相似的。 设计一个通用的工厂,只提供一个工厂方法,所有实现类的对象都由该方法创建。 /src/main/java/cn/tedu/commonfactory/BeanFactory.java: public class BeanFactory { private static Properties properties = new Properties(); static { try { InputStream inputStream = BeanFactory.class.getResourceAsStream( "/applicationContext.properties"); properties.load(inputStream); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } public static Object getBean(String key) { Object object = null; try { object = Class.forName( properties.getProperty(key)).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return object; } } 2 通过通用工厂创建对象 /src/main/java/cn/tedu/commonfactory/UserServiceImpl.java: public class UserServiceImpl implements UserService { private UserDao userDao = (UserDao) BeanFactory.getBean("userDao"); @Override public void register(User user) { userDao.save(user); } @Override public User login(String username, String password) { return userDao.query(username, password); } } /src/test/java/cn/tedu/commonfactory/UserServiceTest.java: class UserServiceTest { @org.junit.jupiter.api.Test void testRegister() { UserService userService = (UserService) BeanFactory.getBean("userService"); userService.register(new User("zhangfei", "123456")); } @org.junit.jupiter.api.Test void testLogin() { UserService userService = (UserService) BeanFactory.getBean("userService"); userService.login("zhangfei", "123456"); } } 例程:CommonFactory - 简单工厂存在大量的代码冗余,扩展性差 - 通用工厂提供通用的工厂方法,创建一切