Loading... # 设计模式(十二)——抽象工厂模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为抽象工厂模式 - 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 ## 示例 实现数据库在SQL Server与Access之间切换,并且还要实现User表与Department表操作之间的切换。 ``` /** * 用户类 */ public 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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return id == user.id; } @Override public int hashCode() { return id; } } ``` ``` /** * 部门类 */ public 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; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Department that = (Department) o; return id == that.id; } @Override public int hashCode() { return id; } } ``` ``` /** * IUser接口 */ public interface IUser { void insert(User user); User getUser(int id); } ``` ``` /** * SqlseverUser类 */ public 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; } } ``` ``` /** * AccessUser类 */ public class AccessUser implements IUser{ @Override public void insert(User user) { System.out.println("在Access中给User表添加一条记录"); } @Override public User getUser(int id) { System.out.println("在Access中根据id得到User表一条记录"); return null; } } ``` ``` /** * IDepartment接口 */ public interface IDepartment { void insert(Department department); Department getDepartment(int id); } ``` ``` /** * SqlserverDepartment类 */ public class SqlserverDepartment implements IDepartment{ @Override public void insert(Department department) { System.out.println("在SQL Server中给Department表增加一条记录"); } @Override public Department getDepartment(int id) { System.out.println("在SQL Server中根据id得到Department表一条记录"); return null; } } ``` ``` /** * AccessDepartment类 */ public class AccessDepartment implements IDepartment{ @Override public void insert(Department department) { System.out.println("在Access中给Department表增加一条记录"); } @Override public Department getDepartment(int id) { System.out.println("在Access中根据id得到Department表一条记录"); return null; } } ``` ``` /** * DataAccess类 */ public class DataAccess { private static String userPath; private static String departmentPath; static { Properties p = new Properties(); try { p.load(DataAccess.class.getClassLoader().getResourceAsStream("app.properties")); userPath = p.getProperty("userPath"); departmentPath = p.getProperty("departmentPath"); } catch (IOException e) { e.printStackTrace(); } } public static IUser createUser() throws ClassNotFoundException, IllegalAccessException, InstantiationException { return (IUser) Class.forName(userPath).newInstance(); } public static IDepartment createDepartment() throws ClassNotFoundException, IllegalAccessException, InstantiationException { return (IDepartment) Class.forName(departmentPath).newInstance(); } } ``` 在resource中添加配置文件app.properties ``` # 类文件的位置 包名.类名 userPath=abstractfactory.AccessUser departmentPath=abstractfactory.AccessDepartment ``` ``` /** * 客户端 */ public class MainClass { public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException { IUser iu = DataAccess.createUser(); iu.insert(new User()); iu.getUser(1); IDepartment id = DataAccess.createDepartment(); id.insert(new Department()); id.getDepartment(1); } } ``` 输出: ``` 在Access中给User表添加一条记录 在Access中根据id得到User表一条记录 在Access中给Department表增加一条记录 在Access中根据id得到Department表一条记录 ``` 要切换成SQL Server只需要在app.properties中将AccessUser切换为SqlserverUser,AccessDepartment切换为SqlserverDepartment。 Last modification:June 11th, 2020 at 06:24 pm © 允许规范转载