- 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类
- 抽象工厂方法的封装性比较好,高层模块无需关心具体实现,只需要知道要使用的工厂类是谁,就能创建出所需对象,切换比较灵活,但是,相比工厂方法模式,抽象工厂模式工厂类扩展需要修改较多代码,违背了开闭原则
- 示例:在实际项目中,常常会遇到更换数据库的需求,使用抽象工厂模式,修改使用的工厂类,即可实现换库。如下所示,IFactory定义的抽象工厂接口,MysqlFactory、SqlServerFactory 分别为mysql数据库、sqlServer数据库的工厂类实现,Mysql Factory、SqlServerFactory会根据会生成IuserDao、IDepartmentDao接口对应的Mysql、SqlServer数据库实例
/**
* @author beck.yang
* @date 2022/6/28 11:33
* @description 抽象工厂模式
*/
public class Main {
public static void main(String[] args) {
IFactory factory = new MysqlFactory();
// 只需修改具体的工厂类,即可实现切换为SqlServer
// IFactory factory = new SqlServerFactory();
IUserDao userDao = factory.createUserDao();
userDao.createUser();
userDao.deleteUser();
IDepartmentDao departmentDao = factory.createDepartmentDao();
departmentDao.createDepartment();
departmentDao.deleteDepartment();
}
}
/**
* @author beck.yang
* @date 2022/6/28 11:38
* @description 抽象工厂接口
*/
public interface IFactory {
<T extends IUserDao> T createUserDao();
<T extends IDepartmentDao> T createDepartmentDao();
}
/**
* @author beck.yang
* @date 2022/6/28 11:44
* @description mysql工厂类
*/
public class MysqlFactory implements IFactory {
@Override
public <T extends IUserDao> T createUserDao() {
return (T) new MysqlUser();
}
@Override
public <T extends IDepartmentDao> T createDepartmentDao() {
return (T) new MysqlDepartment();
}
}
/**
* @author beck.yang
* @date 2022/6/28 11:45
* @description sqlServer工厂
*/
public class SqlServerFactory implements IFactory{
@Override
public <T extends IUserDao> T createUserDao() {
return (T) new SqlServerUser();
}
@Override
public <T extends IDepartmentDao> T createDepartmentDao() {
return (T) new SqlServerDepartment();
}
}
/**
* @author beck.yang
* @date 2022/6/28 11:34
* @description 用户接口
*/
public interface IUserDao {
void createUser();
void deleteUser();
}
/**
* @author beck.yang
* @date 2022/6/28 11:38
* @description
*/
public class MysqlUser implements IUserDao {
@Override
public void createUser() {
System.out.println("Create user in mysql.");
}
@Override
public void deleteUser() {
System.out.println("Delete user in mysql.");
}
}
/**
* @author beck.yang
* @date 2022/6/28 11:39
* @description
*/
public class SqlServerUser implements IUserDao {
@Override
public void createUser() {
System.out.println("Create user in sqlServer.");
}
@Override
public void deleteUser() {
System.out.println("Delete user in sqlServer.");
}
}
/**
* @author beck.yang
* @date 2022/6/28 11:36
* @description 部门接口
*/
public interface IDepartmentDao {
void createDepartment();
void deleteDepartment();
}
/**
* @author beck.yang
* @date 2022/6/28 11:39
* @description mysql部门实现
*/
public class MysqlDepartment implements IDepartmentDao {
@Override
public void createDepartment() {
System.out.println("Create department in mysql.");
}
@Override
public void deleteDepartment() {
System.out.println("Delete department in mysql.");
}
/**
* @author beck.yang
* @date 2022/6/28 11:40
* @description sqlServer部门实现
*/
public class SqlServerDepartment implements IDepartmentDao {
@Override
public void createDepartment() {
System.out.println("Create department in sqlServer.");
}
@Override
public void deleteDepartment() {
System.out.println("Delete department in sqlServer.");
}
}