设计模式学习笔记之抽象工厂设计模式

来源:互联网 发布:ubuntu新建文件 不能 编辑:程序博客网 时间:2024/04/29 11:38

抽象工厂,是提供一组接口,而不考虑实现。

比如我们有两个接口,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 blocke.printStackTrace();}}public IUser getUser(){try {return (IUser) Class.forName("AbstractFactory."+name+"User").newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public IClass getClass1() {try {return (IClass) Class.forName("AbstractFactory."+name+"Class").newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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的反射技术配合到一起,那真是绝妙啊。