抽象工厂模式:为一组相关或者相互依赖的对象提供一个接口,而且无需指定他们的具体类。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。
用了工厂方法模式的数据访问程序
User.java用户类(只有ID和Name两个字段)
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;
}
}
IUser.java-用于对User进行操作的通用接口
public interface IUser {
void insert(User user);
User getUser(int id);
}
AccessUser.java-对数据库操作的具体实现
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;
}
}
SqlServerUser.java-对数据库操作的具体实现
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;
}
}
IFactory.java-用于创建访问user表的对象
public interface IFactory {
IUser createUser();
}
sqlServerFactory.java-实现IFactory接口,创建sqlServerUser对象
public class SqlServerFactory implements IFactory{
@Override
public IUser createUser() {
return new SqlServerUser();
}
}
AccessFactory.java-实现IFactory接口,创建AccessUser对象
public class AccessFactory implements IFactory{
@Override
public IUser createUser() {
return new AccessUser();
}
}
测试
public class Test {
public static void main(String[] args) {
User user = new User();
SqlServerFactory sqlServerFactory = new SqlServerFactory();
IUser createUser = sqlServerFactory.createUser();
createUser.insert(user);
createUser.getUser(1);
}
}
输出
改进(去除IFactory、SqlServerFactory、AccessFactory三个工厂,取而代之DataAccess类,用一个简单工厂模式实现)
DataAccess.java
public class DataAccess {
private static final String db="SqlServer";
// private static final String db="Access";
public static IUser createUser(){
IUser result=null;
switch(db){
case "SqlServer":result=new SqlServerUser(); break;
case "Access":result=new AccessUser();break;
}
return result;
}
public static IDepartment createDepartment(){
IDepartment result=null;
switch(db){
case "SqlServer":result=new SqlServerDepartment(); break;
case "Access":result=new AccessDepartment();break;
}
return result;
}
}
测试
public class Test2 {
public static void main(String[] args) {
User user = new User();
Department department = new Department();
IUser iu = DataAccess.createUser();
IDepartment id = DataAccess.createDepartment();
iu.insert(user);
iu.getUser(1);
id.insert(department);
id.getUser(1);
}
}
用反射+抽象工厂进行数据访问
通过反射实现程序由编译时创建对象变为运行时创建对象,通过字符串来实例化对象。
DataAccessR类利用反射技术,取代IFactory、SqlServerFactory、AccessFactory三个工厂
DataAccessR.java
public class DataAccessR {
private static final String commonPackageName="zx.abstractfactory.test2";
private static final String db="sqlserver";
public static IUser createUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
String className=commonPackageName+"."+db+".SqlServerUser";
System.out.println("SqlServerUser的全路径名 "+className);
IUser sqlServerUser=(SqlServerUser)Class.forName(className).newInstance();
return sqlServerUser;
}
public static IDepartment createDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
String className=commonPackageName+"."+db+".SqlServerDepartment";
System.out.println("SqlServerDepartment的全路径名 "+className);
IDepartment sqlServerDepartment=(SqlServerDepartment)Class.forName(className).newInstance();
return sqlServerDepartment;
}
}
测试
public class TestR {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
User user = new User();
Department department = new Department();
IUser createUser = DataAccessR.createUser();
IDepartment createDepartment = DataAccessR.createDepartment();
createUser.insert(user);
createUser.getUser(1);
createDepartment.insert(department);
createDepartment.getUser(1);
System.out.println("testR");
}
}
输出