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

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

参考《大话设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值