定义
抽象工厂模式:提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类。
工厂模式是用来创建同一个产品的不同类型的,但是抽象工厂模式是用来创建一系列类的产品。产品种类单一,适合用工厂模式;如果有多个种类,各种类型时,通过抽象工厂模式来进行创建是很合适的。
结构图
实例:
设计一个部门人员的管理系统(后续可能会更改数据库的类型)。
类图:
编码实现:
IFactory类:
public interface IFactory {
public IUserDao createUserDao();
public IDepartmentDao createDepartmentDao();
}
当数据库是MySQL时,生产操作一系列产品的工厂类
MySQLFactory 类:
public class MySQLFactory implements IFactory{
@Override
public IUserDao createUserDao() {
return new MySQLUserDao();
}
@Override
public IDepartmentDao createDepartmentDao() {
return new MySQLDepartmentDao();
}
}
当数据库是Oracle时,生产操作一系列产品的工厂类
OracleFactory类:
public class OracleFactory implements IFactory {
@Override
public IUserDao createUserDao() {
return new OracleUserDao();
}
@Override
public IDepartmentDao createDepartmentDao() {
return new OracleDepartmentDao();
}
}
操作用户类的接口
IUserDao接口:
public interface IUserDao {
public void Insert(User user);
public User getUser(int id);
}
数据库是MySQL时,User对应的操作类
MySQLUserDao 类
public class MySQLUserDao implements IUserDao{
@Override
public void Insert(User user) {
System.out.println("在MySQL中的User表添加一条记录!");
}
@Override
public User getUser(int id) {
System.out.println("从MySQL中的User表中取出一条数据!");
return null;
}
}
数据库是Oracle时,User类对应的操作类
OracleUserDao
public class OracleUserDao implements IUserDao {
@Override
public void Insert(User user) {
System.out.println("在Oracle中的User表中插入一条记录!");
}
@Override
public User getUser(int id) {
System.out.println("从Oracle中的User表中取出一条数据!");
return null;
}
}
操作部门类的接口
IDepartmentDao
public interface IDepartmentDao {
public void insert(Department department);
public Department getDepartment(int id);
}
数据库是MySQL时,Department对应的操作类
MySQLDepartmentDao 类
public class MySQLDepartmentDao implements IDepartmentDao{
@Override
public void insert(Department department) {
System.out.println("在MySQL中的Department表添加一条记录!");
}
@Override
public Department getDepartment(int id) {
System.out.println("从MySQL中的Department表中取出一条数据!");
return null;
}
}
数据库是Oracle时,Department对应的操作类
OracleDepartmentDao 类
public class OracleDepartmentDao implements IDepartmentDao {
@Override
public void insert(Department department) {
System.out.println("在Oracle中的Department表添加一条记录!");
}
@Override
public Department getDepartment(int id) {
System.out.println("从Oracle中的Department表中取出一条数据!");
return null;
}
}
客户端代码
public class Client {
public static void main(String[] args) {
IFactory factory = new MySQLFactory();
IUserDao userDao = factory.createUserDao();
IDepartmentDao departmentDao = factory.createDepartmentDao();
//插入一个用户
userDao.Insert(new User());
}
}