抽象工厂,是提供一组接口,而不考虑实现。
比如我们有两个接口,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的反射技术配合到一起,那真是绝妙啊。