面向接口编程在工厂模式下的实现

去年“面向对象程序设计”课程的最后一道大题是用“类工厂”模式实现一个数据库组件。“类工厂”的类里对于不同数据库类型的处理是用switch...case语句来实现的,但这不符合面向对象的设计原则。如:工厂里只判断了两种数据库类型,如果再增加一个数据库类型势必要改写“类工厂”的代码(即,再加一条case语句)。问题是:如何利用合理的设计方法改善这种弊端。

    今天有研一的同事问起我,正好我对这个也是云里雾里。顺便问了一下高手,具体实现了出来。与大家共勉。

 大的方向是利用“面向接口编程”的理论来实现。

 

    首先,定义一个接口,接口里写了一些抽象的方法。如:得到数据库连接,根据sql语句得到结果集。

    第二,定义不同数据库类型对接口中的抽象方法的具体实现的类。如:OracleAccess,SqlAccess。这些类中一定包含与上面接口中的抽象方法具有相同签名的方法。方法中有具体实现功能代码。

    第三,定义“类工厂”,“类工厂”中的构造方法需要有一个入参,即,数据库类型(dbType)。还要有一个得到具体类的实例的方法。

    第四,如果你不嫌麻烦,还可以写一个读取配置文件的类。当然不写也可以。

    第五,编辑一个配置文件,我这里用的是.properties文件。文件中就是key和value对应的关系。如:oracle=OracleAccess。其中,value就是要返回的实例的类名称。

  好了,现在看看各类的具体代码。这里为了方便起见,我用的返回不同字符串的方法。没有用数据库的操作。

  1、接口:

    public interface IDBAccess {
        public String getString();
    }

  2、实现接口的具体类:

    public class OracleAccess implements IDBAccess{
        public OracleAccess(){
  
        }
        public String getString(){
            String conn = "oracle instance";
            return conn;
        }
    }

    public class SqlAccess implements IDBAccess{
        public SqlAccess(){
  
        }
        public String getString(){
            return "sql instance";
        }
    }

  3、类工厂

    public class DBFactory {
        private String instance;
        public DBFactory(String dbType){
                instance = (String)ConstantLib.getInstance().context.get(dbType);
              }
              public IDBAccess getInstance() throws Exception{
                     IDBAccess dbInstance = (IDBAccess)((Class.forName(instance)).newInstance());
                     return dbInstance;
             }
        }

  4、配置文件的编辑

    oracle=OracleAccess
    sql=SqlAccess

  5、现在可以写一个测试程序了,看看能不能运行。

    public class test {
               public static void main(String args[]) throws Exception{
                      DBFactory dbFactory = new DBFactory("sql");
                      IDBAccess instance = dbFactory.getInstance();
                      System.out.println(instance.getString());
              }
        }

看看能不能输出sql instance这个字符串,把工厂的入参该成oracle试试。能不能输出oracle instance这个字符串。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值