java 之 抽象工厂模式(大话设计模式)

时间:2023-03-08 20:14:16

看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套。

来看下类图:

大话设计模式-类图

java 之 抽象工厂模式(大话设计模式)

看类图已经很乱了,来简单的梳理下。我们只看接口,这样就不难看出实际上是抽象工厂生产抽象产品的过程,而具体实现都是各自的实现类来做。

看下具体的demo:

工厂层

/**
* 工厂接口
*/
public interface IFactory { public IUser createUser(); public IDepartment createDepartment();
}
/**
* Mysql工厂
*/
public class MysqlFactory implements IFactory{ @Override
public IUser createUser() {
return new UserMapper();
} @Override
public IDepartment createDepartment() {
return new DepartmentMapper();
} }
/**
* sqlserver工厂
*/
public class SqlServerFactory implements IFactory{ @Override
public IUser createUser() {
return new UserMapper();
} @Override
public IDepartment createDepartment() {
return new DepartmentMapper();
} }

产品层

/**
* 部门层接口
*/
public interface IDepartment { public int saveDepartment(Department department); public IDepartment getDepartment(int id);
}
/**
* 角色数据层接口
*/
public interface IUser { public int saveUser(User user); public IUser getUser(int id);
}
/**
* 部门数据层
*/
public class DepartmentMapper implements IDepartment{ @Override
public int saveDepartment(Department department) {
System.out.println("保存了部门");
return 1;
} @Override
public IDepartment getDepartment(int id) {
System.out.println("得到了一个部门");
return null;
} }
/**
* 角色数据层
*/
public class UserMapper implements IUser { @Override
public int saveUser(User user) {
System.out.println("保存Uer");
return 1;
} @Override
public IUser getUser(int id) {
System.out.println("得到一个User");
return null;
} }

客户端及实体类

/**
*用户实体类
*/
public class User{ }
/**
* 部门实体类
*/
public class Department { }
/**
* 客户端
*/
public class Test { public static void main(String[] args) {
// IFactory factory = new MysqlFactory();
IFactory factory = new SqlServerFactory();
IUser userMapper = factory.createUser();
userMapper.getUser(userMapper.saveUser(new User()));
}
}

如果我们切换数据库,我们只需要切换工厂就可以了,其他的代码不需要改。

以上是笔者对抽象工厂的理解,希望能帮助学习抽象工厂的小伙伴!