看了几次抽象工厂模式,每次查看都需要重新理解一次,可能是涉及的类和接口比较多,所以比较难缕清的关系吧!在笔者看来,我们还是要吸取其思想而不是生搬硬套。
来看下类图:
大话设计模式-类图
看类图已经很乱了,来简单的梳理下。我们只看接口,这样就不难看出实际上是抽象工厂生产抽象产品的过程,而具体实现都是各自的实现类来做。
看下具体的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())); } }
如果我们切换数据库,我们只需要切换工厂就可以了,其他的代码不需要改。
以上是笔者对抽象工厂的理解,希望能帮助学习抽象工厂的小伙伴!