抽象工厂模式

  • 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类
  • 抽象工厂方法的封装性比较好,高层模块无需关心具体实现,只需要知道要使用的工厂类是谁,就能创建出所需对象,切换比较灵活,但是,相比工厂方法模式,抽象工厂模式工厂类扩展需要修改较多代码,违背了开闭原则
  • 示例:在实际项目中,常常会遇到更换数据库的需求,使用抽象工厂模式,修改使用的工厂类,即可实现换库。如下所示,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.");
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值