有关三种工厂模式的知识,请看我这篇博文
http://blog.csdn.net/qq_34149805/article/details/53455268
我们直接来看一个抽象工厂的Demo
1.抽象产品类
数据库增删改用到的 User表 Department表
public interface IUser {
public abstract void Insert();
public abstract void Delete();
}
public interface IDepartment {
public abstract void Insert();
public abstract void Delete();
}
2.实体产品类
这里考虑的两种不同的数据库,sqlserver 和 access 两种数据库在做增删改的时候语句会有略微的不同,如果项目要从sqlserver 换到 access 甚至orcle 麻烦就大了。
使用access
public class AccessDepartment implements IDepartment{
@Override
public void Insert() {
// TODO Auto-generated method stub
System.out.println("用Access插入部门");
}
@Override
public void Delete() {
// TODO Auto-generated method stub
System.out.println("用Accesss删除部门");
}
}
public class AccessUser implements IUser {
@Override
public void Insert() {
System.out.println("用Access插入人员");
}
@Override
public void Delete() {
System.out.println("用Access删除人员");
}
}
使用sqlserver
public class SqlServerUser implements IUser {
@Override
public void Insert() {
System.out.println("用SQl插入人员");
}
@Override
public void Delete() {
System.out.println("用SQL删除人员");
}
}
public class SqlServerDepartment implements IDepartment{
public void Insert() {
System.out.println("用sql插入部门");
}
public void Delete() {
// TODO Auto-generated method stub
System.out.println("用sql删除部门");
}
}
3.抽象工厂
public interface IFactoty {
public abstract IDepartment CreateDepartment();
public abstract IUser CreateUser();
}
4.实体工厂
public class AccessFactory implements IFactoty {
public IDepartment CreateDepartment() {
// TODO Auto-generated method stub
return new AccessDepartment();
}
public IUser CreateUser() {
// TODO Auto-generated method stub
return new AccessUser();
}
}
public class SqlServerFactory implements IFactoty{
@Override
public IDepartment CreateDepartment() {
// TODO Auto-generated method stub
return new SqlServerDepartment();
}
@Override
public IUser CreateUser() {
// TODO Auto-generated method stub
return new SqlServerUser();
}
}
5.调用
public static void main(String[] args) {
IFactoty Accessfactoty = new AccessFactory();
IFactoty SqlServerfactoty = new SqlServerFactory();
IUser user = Accessfactoty.CreateUser();
user.Insert();
user.Delete();
IUser user2 = SqlServerfactoty.CreateUser();
user2.Insert();
user2.Delete();
IDepartment department = Accessfactoty.CreateDepartment();
department.Insert();
department.Delete();
IDepartment department2 = SqlServerfactoty.CreateDepartment();
department2.Insert();
department2.Delete();
}
很明显,虽然我们的程序符合了开闭原则,但是程序中实例化的更多的对象。
如果我们再加入Oracle数据库,我们要修改 IFactory SqlServerFactory AccessFactory 三个类。
下面看用反射机制改进的代码 用 RefactorFactory代替以上三个类:
首先我们把要操作的数据库类型,以及数据库helper所在包名写入配置文件中。
这里我用txt文件代替配置文件
public class RefactorFactory {
public IDepartment CreateDepartment() {
IDepartment department = null;
String PACKAGENAME = null;
String DADANAME = null;
try {
DADANAME = getDataName();
PACKAGENAME = getPackageName();
String className = PACKAGENAME + "." + DADANAME + "Department";
department = (IDepartment) Class.forName(className).getConstructor().newInstance();
} catch (Exception e) {
System.out.println("创建出错");
}
return department;
}
public IUser CreateUser() {
IUser user = null;
String PACKAGENAME = null;
String DADANAME = null;
try {
DADANAME = getDataName();
PACKAGENAME = getPackageName();
String className = PACKAGENAME + "." + DADANAME + "User";
user = (IUser) Class.forName(className).getConstructor().newInstance();
} catch (Exception e) {
System.out.println("创建出错");
}
return user;
}
private String getPackageName() throws IOException {
Properties properties = new Properties();
FileReader fileReader = new FileReader("config.txt");
properties.load(fileReader);
fileReader.close();
String PACKAGENAME = properties.getProperty("PACKAGENAME");
return PACKAGENAME;
}
private String getDataName() throws IOException {
Properties properties = new Properties();
FileReader fileReader = new FileReader("config.txt");
properties.load(fileReader);
fileReader.close();
String DADANAME = properties.getProperty("DADANAME");
return DADANAME;
}
}
这样我们用一个RefactorFactory 类代替了三个类,如果又要加入新的数据库,我们只需增加抽象产品和实体产品类,再修改配置文件即可!
调用:
RefactorFactory factoty = new RefactorFactory();
IDepartment createDepartment = factoty.CreateDepartment();
createDepartment.Insert();
IUser user = factoty.CreateUser();
user.Insert();
源码下载: