工厂模式就是根据提供的图纸制造对应的东西。
下面是一个根据properties配置文件,生产一个UserDao实例的例子。这样的好处是修改配置文件就可以修改DaoFactory生产出的UserDao实现类,而不需要修改代码。
工厂代码:
package com.xiaol.study.dao;
import java.io.InputStream;
import java.util.Properties;
public class DaoFactory {
// 注意类初始化的顺序
// 如果userDao = null放在instance = new DaoFactory()后面,那执行顺序就是代码后面的注释
// 那么会导致已经拿到UserDao对象引用的userDao被置为null
private UserDao userDao = null;// 3
private static DaoFactory instance = new DaoFactory();// 1
private DaoFactory() {
try {
Properties prop = new Properties();
// 通过类加载器加载文件比用文件系统加载要好
InputStream inStream = DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");
prop.load(inStream);
String UserDaoClass = prop.getProperty("userDaoClass");
Class clazz = Class.forName(UserDaoClass);
userDao = (UserDao) clazz.newInstance();// 2
} catch (Throwable e) {
// 把异常捕获为unchecked异常
throw new ExceptionInInitializerError(e);
}
}
public static DaoFactory getInstance() {
return instance;
}
public UserDao getUserDao() {
return userDao;
}
}
UserDaoImpl1:
package com.xiaol.study.dao;
public class UserDaoImpl1 implements UserDao {
public void save() {
System.out.println("Impl1 save!");
}
}
UserDaoImpl2:
package com.xiaol.study.dao;
public class UserDaoImpl2 implements UserDao {
public void save() {
System.out.println("Impl2 save!");
}
}
daoconfig.properties:
userDaoClass=com.xiaol.study.dao.UserDaoImpl1
运行效果:
Impl1 save!