【java基础补充】java接口、工厂模式和抽象类

接口 Interface
       没有方法体,只有抽象方法, implements接口时候必须实现该接口所定义的所有的抽象方法

       可以implements多个接口 用,号间隔.

       接口体现了抽象的观点,什么是抽象?抽象就是"抽去像的部分"。 


        问题:现在我们要写个连接数据库的类给用户使用,有两个函数:一个返回Connection对象,另一个是关闭数据库,close(),一般的解决方法是:给每个数据库写一个类,再根据用户使用的数据库决定使用具体的类。 好的,我们看看这样有什么不好之处:

(1).首先每个类都要有重复的代码,造成代码的膨胀;

(2).其次最重要的是我们并不知道用户使用什么数据库,可能是Oracle,可能是mysql,也可能是sqlserver等,这个问题很难解决。

解决方案:

首先我们定义接口:


public interface DataBase
  {
  java.sql.Connection openDB(String url,String user,String password);
  void close(); 

       public boolean isClose();
  }


我们定义了两个方法,openDB返回Connection对象,close()关闭数据库;

具体的实现在实现DataBase接口的类中;

下面看看实现:


import java.sql.*;
  public class Mysql implements DataBase
  {
  private String url=”jdbc:mysql:localhost:3306/test”;
  private String user=”root”;
  private String password=””;
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    //连接数据库的代码
  }

  public void close()
  {
    //关闭数据库
  }

       public boolean isClose(){
        if(conn!=null)
             return false;
        else
            return true;
         }

  }


Mysql 实现了DataBase接口,同样的还会有实现了DataBase接口的Oraclesql等类; 

到目前为止,我们只能根据数据库 myDB=new Mysql()或者myDB=new Oracle(),好像个各自实现还没有什么差别??

这时候,我们需要一个工厂: 

工厂模式:主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

public class DBFactory
  {
  public static DataBase Connection getConn()
  {
    Return(new Mysql());
  }
  }
实例化的代码变成:myDB=DBFactory.getConn();

整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB对象就OK,而不管工厂类如何变化。这就是接口的意义----抽象。


到此我们还会想到,每个实现接口的类会有公共的方法,这样,代码还是重复??

此时我们可以用抽象类:

抽象类  Abstract
       可以有一部份实现方法,也可以有抽象方法,
       只可以extends一个抽象类

public abstract class AbstractDataOperate  implements DataOperate{
     public Connection createConn(){
            return null;
     }
     public void closeConn(){
     }
     public ResultSet getRs(){
            return null;
     }
     public boolean exec(){
            return fasle;
     }
     /**
     *公共方法的实现
     **/
     public boolean isClose(){
        if(conn!=null)
             return false;
        else
            return true;
     }

   
   }


接下来我们分别写3个类OracleDataOperate,SqlServerDataOperate,MySqlDataOperate继承AbstractDatOperate具体实现方法 这里不再叙述

好了 现在最后一步 写一个工厂方法来统一得到数据库操作类的实例
public class DataOperateFactory{
     public static final int OracleKey=1;
     public static final int SqlServerKey=2;   
     public static final int MySqlKey=3;
    
     public static int DbType =OracleKey;
     private static DataOperate db;
    
     public static DataOperate getInstance(){
           if(db==null){
                   if(DbType==OracleKey)
                        db=new OracleDataOperate();
                  else if(DbType==SqlServerKey)
                        db=new SqlServerDataOperate();
                  else if(DbType==MySqlKey)
                        db=new MySqlDataOperate();
          }
         return db;
     }
}

Ok 到此所有工作都完成 来测试吧
public class  MyTest{
  public static void main(String args[]){
      
      DataOperate db=DataOperateFactory.getInstance();
      db.createConn();

   }
}


在MyTest类里根本没有出现OracelDataOperate、MysqlDataOperate等的影子,这就是接口的威力。客户端不必针对OracelDataOperate等写不同的代码,它只关心DataOperate即可,具体要取那个类的逻辑就由DataOperateFactory负责了。
如果还有新的数据库添加的话 只需要象OracleaDataOperate那样 再写一个这样类 继承AbstractDataOperate类 然后在工厂类里DataOperateFactory加上相应的代码即可

补充:JAVA接口作为参数传递

    可以将借口类型的参数作为方法参数,在实际是使用时可以将实现了接口的类传递给方法,后方法或按照重写的原则执行,实际调用的是实现类中的方法代码体,这样便根据传进屋的参数的不同而实现不同的功能。重要的是,当我以后徐要林外一个对象并且拥有接受说生命的方法的时候的时候,我们不必须原类,只需新的类实现借口即可。

    import java.lang.*;

    interface Extendbroadable {
        public void inPut(); 
    } 

    class KeyBroad implements Extendbroadable {
        public void inPut() {
            System.out.println("  hi,keybroad has be input into then mainbroad! "); 
        }
    }

    class NetCardBroad implements Extendbroadable {
        public void inPut() {
            System.out.println("  hi,netCardBroad has be input into then mainbroad! "); 
        }
    }

    class CheckBroad {
        public void getMainMessage(Extendbroadable ext){ 
            ext.inPut(); 
        }
    }

    public class InterfaceTest01 {
        public static void main(String []args) {
            KeyBroad kb=new KeyBroad();
            NetCardBroad ncb=new NetCardBroad();
            CheckBroad cb=new CheckBroad();
            cb.getMainMessage(kb);
            cb.getMainMessage(ncb);
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值