java学习-设计模式-抽象工厂模式
一 定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
二 代码实例
-
需求
对于不同的数据库和不同的表,如mysql,oracle都能够简单的就可以实现查询更新操作。换数据库是,无需改动太多的代码。
-
代码实现
部门类:
public class Dept { private String deptNo; private String deptName; public String getDeptNo() { return deptNo; } public void setDeptNo(String deptNo) { this.deptNo = deptNo; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } @Override public String toString() { return "Dept{" + "deptNo='" + deptNo + '\'' + ", deptName='" + deptName + '\'' + '}'; } }
用户类:
public class User { private String id; private String username; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", username='" + username + '\'' + '}'; } }
部门接口类:
public interface IDept { void insert(Dept dept); Dept getById(String id); }
用户接口类:
public interface IUser { void insert(User user); User getById(String id); }
不同数据库实现类:
public class MysqlDeptImpl implements IDept { @Override public void insert(Dept dept) { System.out.println("在mysql数据库Dept表中插入一条数据" + dept.toString()); } @Override public Dept getById(String id) { System.out.println("在mysql数据库Dept表中通过id为" + id + "来获得一条数据"); return null; } }
public class MysqlUserImpl implements IUser { @Override public void insert(User user) { System.out.println("在mysql数据库User表中插入一条数据" + user.toString()); } @Override public User getById(String id) { System.out.println("在mysql数据库User表中通过id为" + id + "来获得一条数据"); return null; } }
public class OracleDeptImpl implements IDept { @Override public void insert(Dept dept) { System.out.println("在oracle数据库Dept表中插入一条数据" + dept.toString()); } @Override public Dept getById(String id) { System.out.println("在oracle数据库Dept表中通过id为" + id + "来获得一条数据"); return null; } }
public class OracleUserImpl implements IUser { @Override public void insert(User user) { System.out.println("在oracle数据库User表中插入一条数据" + user.toString()); } @Override public User getById(String id) { System.out.println("在oracle数据库User表中通过id为" + id + "来获得一条数据"); return null; } }
具体的工厂类:(重点)
package com.ct.factory; public class IFactory { private static String packageName = "com.ct.factory.impl."; //实际开发中可以设置到properties文件中 值为Oracle则操作oracle数据库 private static String dbName = "Mysql"; public static IUser createUserOpera() { String name = packageName + dbName + "UserImpl"; IUser iUser = null; try { iUser = (IUser) Class.forName(name).newInstance(); } catch (Exception e) { e.printStackTrace(); } return iUser; } public static IDept createDeptOpera() { String name = packageName + dbName + "DeptImpl"; IDept iDept = null; try { iDept = (IDept) Class.forName(name).newInstance(); } catch (Exception e) { e.printStackTrace(); } return iDept; } }
测试类:
public class Test { public static void main(String[] args) { User user = new User(); user.setId("1"); user.setUsername("zhangsan"); IUser iUser = IFactory.createUserOpera(); iUser.insert(user); iUser.getById("1"); Dept dept = new Dept(); dept.setDeptNo("1"); dept.setDeptName("事业部"); IDept iDept = IFactory.createDeptOpera(); iDept.insert(dept); iDept.getById("1"); } }
抽象工厂模式:提供一个创建一系列相关或相互依赖的对象接口,而无需指定它们具体的类。该工厂通过java的反射技术进行创建具体的对象。更换数据库,只需要改一处即可。增加新的数据库或者增加新的表只需要增加实现类即可,开放封闭原则得到了完美的体现。而且可扩展,灵活,易于维护。
微信扫一扫
关注该公众号