工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构
抽象工厂
public interface IFactory {
IUser createUser();
IDepartment createDepartment();
}
抽象产品
public interface IUser {
void insert();
}
public interface IDepartment {
void insert();
}
具体工厂
public class MysqlFactory implements IFactory {
@Override
public IUser createUser() {
return new MysqlUser();
}
@Override
public IDepartment createDepartment() {
return new MysqlDepartment();
}
}
public class OracleFactory implements IFactory {
@Override
public IUser createUser() {
return new OracleUser();
}
@Override
public IDepartment createDepartment() {
return new OracleDepartment();
}
}
具体产品
public class MysqlUser implements IUser {
@Override
public void insert() {
System.out.println("mysql: insert user");
}
}
public class OracleUser implements IUser {
@Override
public void insert() {
System.out.println("oracle: insert user");
}
}
public class MysqlDepartment implements IDepartment {
@Override
public void insert() {
System.out.println("msyql: insert department");
}
}
public class OracleDepartment implements IDepartment {
@Override
public void insert() {
System.out.println("oracle: insert department");
}
}
测试
@Test
public void test() {
// 指定需要使用的数据库工厂实例
IFactory factory = new MysqlFactory();
IUser userDao = factory.createUser();
userDao.insert();
IDepartment departmentDao = factory.createDepartment();
departmentDao.insert();
}
去掉 if 分支逻辑,比较经典处理方法就是利用多态
所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合
在Spring中,所有工厂都是BeanFactory的子类。通过对BeanFactory的实现,我们可以从Spring的容器访问Bean。根据不同的策略调用getBean()方法,从而获得具体对象