今天来介绍一下另一个复杂一点的抽象工厂模式。
1.UML类图
IUser和IDepartment是想要创建的产品的抽象接口,而SqlserverUser、AccessUser和SqlserverDepartment、AccessDepartment分别是其两种不同的具体产品实现类。IFactory是抽象工厂,其中定义了创建两种产品的接口,其具体实现类实现这两个方法根据需求创建不同的IUser和IDepartment实现类。
2.示例代码
IUser接口以及其对应的两个实现类
public interface IUser { void insert(User user); User getUser(Integer id); }
public class SqlServerUser implements IUser { @Override public void insert(User user) { System.out.println("在sql server中给user表添加一条记录"); } @Override public User getUser(Integer id) { System.out.println("在sql server中根据id得到user表一条记录"); return null; } }
public class AccessUser implements IUser { @Override public void insert(User user) { System.out.println("在access中给user表添加一条记录"); } @Override public User getUser(Integer id) { System.out.println("在access中根据id得到user表一条记录"); return null; } }
IDepartment接口以及其对应的实现类
public interface IDepartment { void insert(Department department); Department getDepartment(Integer id); }
public class SqlServerDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在sql server中给department表添加一条记录"); } @Override public Department getDepartment(Integer id) { System.out.println("在sql server中根据id得到department表一条记录"); return null; } }
public class AccessDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在access中给department表添加一条记录"); } @Override public Department getDepartment(Integer id) { System.out.println("在access中根据id得到department表一条记录"); return null; } }
IFactory抽象工厂以及其对应的两个具体实现工厂,相应的具体工厂中定义了创建User和Department的方法
public interface IFactory { IUser createUser(); IDepartment createDepartment(); }
public class AccessFactory implements IFactory { @Override public IUser createUser() { return new AccessUser(); } @Override public IDepartment createDepartment() { return new AccessDepartment(); } }
public class SqlServerFactory implements IFactory { @Override public IUser createUser() { return new SqlServerUser(); } @Override public IDepartment createDepartment() { return new SqlServerDepartment(); } }
public class Client { public static void main(String[] args) { User user = new User(); Department department = new Department(); IFactory factory = new SqlServerFactory(); IUser iu = factory.createUser(); iu.insert(user); iu.getUser(2); } }
3.特点
抽象工厂提供一个创建一系列相关类或相互依赖对象的接口,而无需指定它们具体的类。它使得改变一个应用的具体工厂变得非常容易,它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。