一、抽象工厂模式:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
二、代码示例
@Data public class User { private String id; private String name; } @Data public class Department { private String id; private String deptName; } public interface IUser { void insert(User user); User getUser(String id); } public interface IDepartment { void insert(Department department); Department getDepartment(String id); } public class SqlserverUser implements IUser { @Override public void insert(User user) { System.out.println("在Sqlserver中给User表插入一条记录"); } @Override public User getUser(String id) { System.out.println("在sqlserver中根据id获取User一条数据"); return null; } } public class AccessUser implements IUser { @Override public void insert(User user) { System.out.println("在Access中给User表插入一条记录"); } @Override public User getUser(String id) { System.out.println("在Access中根据id获取User一条数据"); return null; } } public class AccessDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在Access中给Department表插入一条记录"); } @Override public Department getDepartment(String id) { System.out.println("在Access中根据id获取Department一条数据"); return null; } } public class SqlserverDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在Sqlserver中给Department表插入一条记录"); } @Override public Department getDepartment(String id) { System.out.println("在sqlserver中根据id获取Department一条数据"); return null; } } public class DataAccess { public static Object createObject(Class<?> className) throws IllegalAccessException, InstantiationException { return className.newInstance(); /* IUser iUser = null; switch (db){ case "Sqlserver": iUser = new SqlserverUser(); break; case "Access": iUser = new AccessUser(); break; } return iUser;*/ } /*public static IDepartment createDepartment(Class<?> className) throws IllegalAccessException, InstantiationException { return (IDepartment) className.newInstance(); }*/ } public class Test { public static void main(String[] args) throws IllegalAccessException, InstantiationException { User user = new User(); Department department = new Department(); IUser iUser = (IUser) DataAccess.createObject(AccessUser.class); iUser.getUser("1"); iUser.insert(user); IDepartment iDepartment = (IDepartment) DataAccess.createObject(SqlserverDepartment.class); iDepartment.getDepartment("2"); iDepartment.insert(department); } }
优点:
1.易于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同产品配置。
2.它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
原文:https://www.cnblogs.com/zsmcwp/p/12656997.html