设计模式--抽象工厂模式

来源:互联网 发布:萝莉有杀气源码 编辑:程序博客网 时间:2024/06/03 15:20

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();    }

参考《大话设计模式》

原创粉丝点击