设计模式之用反射机制改进的抽象工厂

有关三种工厂模式的知识,请看我这篇博文
http://blog.csdn.net/qq_34149805/article/details/53455268

我们直接来看一个抽象工厂的Demo

1.抽象产品类

数据库增删改用到的 User表 Department表

public interface IUser {
    public abstract void Insert();
    public abstract void Delete();
}
public interface IDepartment {
    public abstract void Insert();
    public abstract void Delete();
}

2.实体产品类

这里考虑的两种不同的数据库,sqlserver 和 access 两种数据库在做增删改的时候语句会有略微的不同,如果项目要从sqlserver 换到 access 甚至orcle 麻烦就大了。

使用access

public class AccessDepartment implements IDepartment{

    @Override
    public void Insert() {
        // TODO Auto-generated method stub
        System.out.println("用Access插入部门");
    }

    @Override
    public void Delete() {
        // TODO Auto-generated method stub
        System.out.println("用Accesss删除部门");
    }
}
public class AccessUser implements IUser {

    @Override
    public void Insert() {
        System.out.println("用Access插入人员");
    }

    @Override
    public void Delete() {
        System.out.println("用Access删除人员");
    }

}

使用sqlserver

public class SqlServerUser implements IUser {

    @Override
    public void Insert() {
        System.out.println("用SQl插入人员");
    }

    @Override
    public void Delete() {
        System.out.println("用SQL删除人员");
    }
}
public class SqlServerDepartment implements IDepartment{

    public void Insert() {
        System.out.println("用sql插入部门");
    }

    public void Delete() {
        // TODO Auto-generated method stub
        System.out.println("用sql删除部门");
    }

}

3.抽象工厂

public interface IFactoty {

    public abstract IDepartment CreateDepartment();

    public abstract IUser CreateUser();

}

4.实体工厂

public class AccessFactory implements IFactoty {

    public IDepartment CreateDepartment() {
        // TODO Auto-generated method stub
        return new AccessDepartment();
    }

    public IUser CreateUser() {
        // TODO Auto-generated method stub
        return new AccessUser();
    }

}
public class SqlServerFactory implements IFactoty{

    @Override
    public IDepartment CreateDepartment() {
        // TODO Auto-generated method stub
        return new SqlServerDepartment();
    }

    @Override
    public IUser CreateUser() {
        // TODO Auto-generated method stub
        return new SqlServerUser();
    }

}

5.调用

    public static void main(String[] args) {

        IFactoty Accessfactoty = new AccessFactory();
        IFactoty SqlServerfactoty = new SqlServerFactory();

        IUser user = Accessfactoty.CreateUser();
        user.Insert();
        user.Delete();
        IUser user2 = SqlServerfactoty.CreateUser();
        user2.Insert();
        user2.Delete();

        IDepartment department = Accessfactoty.CreateDepartment();
        department.Insert();
        department.Delete();
        IDepartment department2 = SqlServerfactoty.CreateDepartment();
        department2.Insert();
        department2.Delete();

    }

很明显,虽然我们的程序符合了开闭原则,但是程序中实例化的更多的对象。

如果我们再加入Oracle数据库,我们要修改 IFactory SqlServerFactory AccessFactory 三个类。

下面看用反射机制改进的代码 用 RefactorFactory代替以上三个类:

首先我们把要操作的数据库类型,以及数据库helper所在包名写入配置文件中。

这里我用txt文件代替配置文件

这里写图片描述

public class RefactorFactory  {

    public IDepartment CreateDepartment() {

        IDepartment department = null;
        String PACKAGENAME = null;
        String DADANAME = null;

        try {
            DADANAME = getDataName();
            PACKAGENAME = getPackageName();
            String className = PACKAGENAME + "." + DADANAME + "Department";
            department = (IDepartment) Class.forName(className).getConstructor().newInstance();
        } catch (Exception e) {
            System.out.println("创建出错");
        }

        return department;
    }

    public IUser CreateUser() {

        IUser user = null;
        String PACKAGENAME = null;
        String DADANAME = null;

        try {
            DADANAME = getDataName();
            PACKAGENAME = getPackageName();
            String className = PACKAGENAME + "." + DADANAME + "User";
            user = (IUser) Class.forName(className).getConstructor().newInstance();
        } catch (Exception e) {
            System.out.println("创建出错");
        }

        return user;
    }

    private String getPackageName() throws IOException {
        Properties properties = new Properties();
        FileReader fileReader = new FileReader("config.txt");
        properties.load(fileReader);
        fileReader.close();
        String PACKAGENAME = properties.getProperty("PACKAGENAME");
        return PACKAGENAME;
    }

    private String getDataName() throws IOException {
        Properties properties = new Properties();
        FileReader fileReader = new FileReader("config.txt");
        properties.load(fileReader);
        fileReader.close();
        String DADANAME = properties.getProperty("DADANAME");
        return DADANAME;
    }

}

这样我们用一个RefactorFactory 类代替了三个类,如果又要加入新的数据库,我们只需增加抽象产品和实体产品类,再修改配置文件即可!

调用:

        RefactorFactory factoty = new RefactorFactory();
        IDepartment createDepartment = factoty.CreateDepartment();
        createDepartment.Insert();
        IUser user = factoty.CreateUser();
        user.Insert();

列表内容

源码下载:

http://download.csdn.net/detail/qq_34149805/9719714

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值