1. 抽象工厂模式
- 抽象工厂模式(Abstract Factory Pattern)指提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类
- 抽象工厂可以称为其他工厂的工厂,它可以在抽象工厂中创建出其他工厂
- 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象
- 引入“产品族”的概念
1.1 组成
- 抽象工厂(IAbstractFactory)
- 具体工厂(ConcreteFactory)
- 抽象产品(IAbstractProduct)
- 具体产品(ConcreteProduct)
1.2 工厂方法 vs 抽象工厂
工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构
2. 实战
抽象工厂
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();
}
3. 优化
去掉 if 分支逻辑,比较经典处理方法就是利用多态
所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,解除分支判断带来的耦合
4. 抽象工厂模式在spring源码中的应用
在Spring中,所有工厂都是BeanFactory的子类。通过对BeanFactory的实现,我们可以从Spring的容器访问Bean。根据不同的策略调用getBean()方法,从而获得具体对象