抽象工厂,是提供一组接口,而不考虑实现。
比如我们有两个接口,IUser和IClass,负责往数据库里面添加信息。然后有OracleUser和OracleClass,负责往Oracle的数据库中添加信息。然后有SqlserverUser和SqlserverClass,负责往Sql server数据库中添加信息。那么,就需要一个抽象工厂,返回用户所需要的具体对象。
我们用properties来储存dbName信息,从而达到一修改即全修改的效果。不用if...else...语句进行判断,然后返回,而是用java的反射技术进行返回,从而达到最大限度的减少代码量的目的。
首先,是定义两个接口:
package AbstractFactory;
public interface IClass {
public void addClass();
public void deleteClass();
public void modifyClass();
}
package AbstractFactory;
public interface IUser {
public void addUser();
public void deleteUser();
public void modifyUser();
}
再就是,定义4个实现类:
package AbstractFactory;
public class OracleClass implements IClass{
public void addClass() {
System.out.println("Oracle add Class");
}
public void deleteClass() {
System.out.println("Oracle delete Class");
}
public void modifyClass() {
System.out.println("Oracle modify Class");
}
}
package AbstractFactory;
public class SqlserverClass implements IClass{
public void addClass() {
System.out.println("Sql server add Class");
}
public void deleteClass() {
System.out.println("Sql server delete Class");
}
public void modifyClass() {
System.out.println("Sql server modify Class");
}
}
package AbstractFactory;
public class OracleUser implements IUser{
public void addUser() {
System.out.println("Oracle add User");
}
public void deleteUser() {
System.out.println("Oracle delete User");
}
public void modifyUser() {
System.out.println("Oracle modify User");
}
}
package AbstractFactory;
public class SqlserverUser implements IUser{
public void addUser() {
System.out.println("Sql server add User");
}
public void deleteUser() {
System.out.println("Sql server delete User");
}
public void modifyUser() {
System.out.println("Sql server modify User");
}
}
然后,就是最为关键的抽象工厂类:
package AbstractFactory;
import java.io.IOException;
import java.util.Properties;
public class AbstractFactory {
private String name;
public AbstractFactory(){
//从Properties文件读取
Properties property = new Properties();
try {
property.load(AbstractFactory.class.getResourceAsStream("AbstractFactory.properties"));
this.name = property.getProperty("dbName");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public IUser getUser(){
try {
return (IUser) Class.forName("AbstractFactory."+name+"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 null;
}
public IClass getClass1() {
try {
return (IClass) Class.forName("AbstractFactory."+name+"Class").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 null;
}
}
测试抽象工厂的类:
package AbstractFactory;
public class AbstractFactoryTest {
public static void main(String[] args){
AbstractFactory factory = new AbstractFactory();
IUser user = factory.getUser();
user.addUser();
user.deleteUser();
user.modifyUser();
IClass iclass = factory.getClass1();
iclass.addClass();
iclass.deleteClass();
iclass.modifyClass();
}
}
最后,就是对properties文件的定义:
dbName=Sqlserver
运行结果为:
Sql server add User
Sql server delete User
Sql server modify User
Sql server add Class
Sql server delete Class
Sql server modify Class
其实,我倒没觉得抽象工厂有多巧妙。但是,和Java的反射技术配合到一起,那真是绝妙啊。