1 抽象工厂模式在工厂方法的基础上演变而来,通过反射来生成指定的对象,现有一需求,对不同的数据库的不同表执行操作。
代码结构图如下:
定义一个用户接口:
public interface IUSer {
public void insert();
}
SqlServer用户操作:
public class SqlServerUser implements IUSer{
@Override
public void insert() {
// TODO Auto-generated method stub
System.out.println("SqlServerUser insert");
}
}
Access用户操作:
public class AccessUser implements IUSer{
@Override
public void insert() {
// TODO Auto-generated method stub
System.out.println("AccessUser insert");
}
}
部门操作:
public interface IDepartment {
public void insert();
}
SqlServer:
public class SqlServerDepartment implements IDepartment{
@Override
public void insert() {
// TODO Auto-generated method stub
System.out.println("SqlServerDepartment insert");
}
}
Access:
public class AccessDepartment implements IDepartment {
@Override
public void insert() {
// TODO Auto-generated method stub
System.out.println("AccessDepartment insert");
}
}
访问中心类,定义一个字符串通过拼接的方式组成类名利用反射来创建对象。
public class DataAccess {
private static final String dataSourceStr = "SqlServer";
// private static final String dataSourceStr="Access";
public static IUser createUser() {
IUser iUser=null;
try {
iUser=(IUser)Class.forName("com.tang.design.abstractfactory2."+dataSourceStr+"User").newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return iUser;
}
public static IDepartment createDepartment() {
IDepartment iDepartment=null;
try {
iDepartment=(IDepartment)Class.forName("com.tang.design.abstractfactory2."+dataSourceStr+"Department").newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return iDepartment;
}
}
利用反射的时候需指明类的全限定名。
测试:
public static void main(String[] args) {
IUser iUser = DataAccess.createUser();
iUser.insert();
IDepartment iDepartment = DataAccess.createDepartment();
iDepartment.insert();
}
参考《大话设计模式》