一、最基本的数据库访问方式
public class OracleUserDaoImpl {
public void insertUser(User user){
System.out.println("在Oracle中给User表添加一条记录");
}
public User queryUser(int id){
System.out.println("在Oracle中根据Id查询一条User记录");
return null;
}
}
public class SqlServerUserDaoImpl {
public void insertUser(User user){
System.out.println("在SQL server中给User表添加一条记录");
}
public User queryUser(int id){
System.out.println("在SQL server中根据Id查询一条User记录");
return null;
}
}
public class User {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二、使用工厂方法模式
public interface IFactory {
IUserDao createUserDao();
}
public interface IUserDao {
void insertUser(User user);
User queryUser(int id);
}
public class OracleFactory implements IFactory {
@Override
public IUserDao createUserDao() {
return new OracleUserDaoImpl();
}
}
public class SqlServerFactory implements IFactory {
@Override
public IUserDao createUserDao() {
return new SqlServerUserDaoImpl();
}
}
public class OracleUserDaoImpl implements IUserDao {
public void insertUser(User user){
System.out.println("在Oracle中给User表添加一条记录");
}
public User queryUser(int id){
System.out.println("在Oracle中根据Id查询一条User记录");
return null;
}
}
public class SqlServerUserDaoImpl implements IUserDao {
public void insertUser(User user){
System.out.println("在SQL server中给User表添加一条记录");
}
public User queryUser(int id){
System.out.println("在SQL server中根据Id查询一条User记录");
return null;
}
}
public class RunMain {
public static void main(String[] args) {
IFactory factory = new OracleFactory();
// IFactory factory = new SqlServerFactory();
IUserDao userDao = factory.createUserDao();
userDao.insertUser(new User());
userDao.queryUser(1);
}
}
三、使用抽象工厂模式
// 抽象工厂接口,包含所有产品创建的抽象方法
public interface IFactory {
IUserDao createUserDao();
IDeptDao createDeptDao(); //新增的接口
}
// 抽象的产品,有两种不同的实现
public interface IDeptDao {
void insertDept(Dept dept);
Dept queryDept(int DeptId);
}
public class Dept {
private String deptName;
}
// 具体工厂
public class OracleFactory implements IFactory {
@Override
public IUserDao createUserDao() {
return new OracleUserDaoImpl();
}
@Override
public IDeptDao createDeptDao() { // 新增工厂
return new OracleDeptDaoImpl();
}
}
public class SqlServerFactory implements IFactory {
@Override
public IUserDao createUserDao() {
return new SqlServerUserDaoImpl();
}
public IDeptDao createDeptDao(){ // 新增工厂
return new SqlServerDeptDaoImpl();
}
}
public class OracleDeptDaoImpl implements IDeptDao {
@Override
public void insertDept(Dept dept) {
System.out.println("在Oracle中给Dept表添加一条记录");
}
@Override
public Dept queryDept(int DeptId) {
System.out.println("在Oracle中根据DeptId查询一条Dept记录");
return null;
}
}
public class SqlServerDeptDaoImpl implements IDeptDao {
@Override
public void insertDept(Dept dept) {
System.out.println("在SQL server中给Dept表添加一条记录");
}
@Override
public Dept queryDept(int DeptId) {
System.out.println("在SQL server中根据DeptId查询一条Dept记录");
return null;
}
}
// 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
// 抽象工厂模式:提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类
public class RunMain {
public static void main(String[] args) {
IFactory factory = new OracleFactory(); // 只需要确定实例化哪个数据库访问对象给factory
IUserDao userDao = factory.createUserDao(); // 此时已与具体的数据库访问解除了依赖
userDao.insertUser(new User());
userDao.queryUser(1);
IDeptDao deptDao = factory.createDeptDao(); //只有一个User类和User操作类的时候,只需要工厂方法模式,但有很多表时且需要切换不同数据库时,有一个专门的工厂模式叫抽象工厂模式。
deptDao.insertDept(new Dept());
deptDao.queryDept(1);
}
}
四、加入反射
public class DataAccess {
private static String AssemblyName = "com.talkDesignPattern.demo11.branch03"; // 全限定名
private static String db = "Oracle"; // SqlServer
private static Properties p = new Properties();
static {
InputStream is = DataAccess.class.getResourceAsStream("db.properties");
try {
p.load(is);
AssemblyName = p.get("assemblyName").toString();
db = p.get("db").toString();
} catch (IOException e) {
e.printStackTrace();
}
}
public static IUserDao createUserDao() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
String className = AssemblyName + "." + db + "UserDaoImpl";
return (IUserDao) Class.forName(className).newInstance();
}
public static IDeptDao createDeptDao() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
String className = AssemblyName + "." + db + "DeptDaoImpl";
return (IDeptDao) Class.forName(className).newInstance();
}
}
#db.properties
assemblyName = com.talkDesignPattern.demo11.branch02
db = Oracle
#db = SqlServer
public class RunMain {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
IUserDao userDao = DataAccess.createUserDao();
userDao.insertUser(new User());
}
}