定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
常用场景: 多数据库实现、多种媒介的日志记录
UML图:
代码:
public interface EmployeeDao {
Employee selectById(int id);
}
public class EmployeeDaoMsSQLImpl implements EmployeeDao {
@Override
public Employee selectById(int id) {
System.out.println("EmployeeDaoMsSQLImpl::selectById");
return new Employee();
}
}
public class EmployeeDaoMySQLImpl implements EmployeeDao {
@Override
public Employee selectById(int id) {
System.out.println("EmployeeDaoMySQLImpl::selectById");
return new Employee();
}
}
public class EmployeeDaoOracleImpl implements EmployeeDao {
@Override
public Employee selectById(int id) {
System.out.println("EmployeeDaoOracleImpl::selectById");
return new Employee();
}
}
public class EmployeeDaoFactory {
public EmployeeDao getEmployeeDao(String databaseType) {
if(databaseType == null) {
return null;
}
switch (databaseType) {
case "MSSQL":
return new EmployeeDaoMsSQLImpl();
case "MYSQL":
return new EmployeeDaoMySQLImpl();
case "ORACLE":
return new EmployeeDaoOracleImpl();
}
return null;
}
}
客户端:
public class Client {
public static void main(String[] args) {
EmployeeDao employeeDao = new EmployeeDaoFactory().getEmployeeDao("ORACLE");
Employee employee = employeeDao.selectById(1);
}
}
简单工厂模式存在一个问题,如示例中需要增加新的数据库类型时,需要修改EmployeeDaoFactory的getEmployeeDao方法,违反了开放-封闭原则,实际应用时可以使用工厂(方法)模式代替。