抽象工厂模式
抽象工厂(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。一般用反射,配置文件等方式实现。
1、易于交换产品系列。
因为详细工厂类。在一个应用中仅仅须要在初始化的时候出现一次。这就使得改变一个应用的详细工厂变得很easy,它仅仅须要改变详细工厂就可以使用不同的产品配置。
2、它让详细的创建实例过程与client分离,client是通过它们的抽象接口操纵实例,产品的详细类名也被详细工厂的实现分离。不会出如今客户代码中。
假设需求来自添加功能,此时,须要添加若干类,并改动相关的工厂类。
package gof23; public class AbstractFactoryTest { public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { //操作SqlServer数据库 DataAccess.setFullyQualifiedName("gof23.Sqlserver"); IUser user = DataAccess.createUser(); user.insert(null); user.getUser(0); IDepartment dept = DataAccess.createDepartment(); dept.insert(null); dept.getDept(0); System.out.println("\n"+"---------------我是华丽的切割线------------------"+"\n"); //操作Mysql数据库 DataAccess.setFullyQualifiedName("gof23.Mysql"); user = DataAccess.createUser(); user.insert(null); user.getUser(0); dept = DataAccess.createDepartment(); dept.insert(null); dept.getDept(0); } } /* * 用户表的字段 */ class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /* * 部门表的字段 */ class Department { private int id; private String deptName; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } } /* * 利用反射技术,去除switch或if,解除分支推断带来的耦合 */ class DataAccess { private static String FullyQualifiedName; public static String getFullyQualifiedName() { return FullyQualifiedName; } public static void setFullyQualifiedName(String fullyQualifiedName) { FullyQualifiedName = fullyQualifiedName; } public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException { String name = FullyQualifiedName + "User"; return (IUser) Class.forName(name).newInstance(); } public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException { String name = FullyQualifiedName + "Department"; return (IDepartment) Class.forName(name).newInstance(); } } /* * 用户表的接口 */ interface IUser{ public void insert(User user); public User getUser(int id); } /* * Sqlserver用户表的实现 */ class SqlserverUser implements IUser { @Override public void insert(User user) { System.out.println("在SQL server中给User表添加一条记录"); } @Override public User getUser(int id) { System.out.println("在SQL server中依据ID得到User表一条记录"); return null; } } /* * Mysql用户表的实现 */ class MysqlUser implements IUser { @Override public void insert(User user) { System.out.println("在Mysql中给User表添加一条记录"); } @Override public User getUser(int id) { System.out.println("在Mysql中依据ID得到User表一条记录"); return null; } } /* * 部门表的接口 */ interface IDepartment { public void insert(Department dep); public Department getDept(int id); } /* * Sqlserver部门表的实现 */ class SqlserverDepartment implements IDepartment { @Override public void insert(Department dep) { System.out.println("在SQL server中给Department表添加一条记录"); } @Override public Department getDept(int id) { System.out.println("在SQL server中依据ID得到Department表一条记录"); return null; } } /* * Mysql部门表的实现 */ class MysqlDepartment implements IDepartment { @Override public void insert(Department dep) { System.out.println("在Mysql中给Department表添加一条记录"); } @Override public Department getDept(int id) { System.out.println("在Mysql中依据ID得到Department表一条记录"); return null; } }
执行结果为:
在SQL server中给User表添加一条记录 在SQL server中依据ID得到User表一条记录 在SQL server中给Department表添加一条记录 在SQL server中依据ID得到Department表一条记录 ---------------我是华丽的切割线------------------ 在Mysql中给User表添加一条记录 在Mysql中依据ID得到User表一条记录 在Mysql中给Department表添加一条记录 在Mysql中依据ID得到Department表一条记录