體現(xiàn)JAVA接口 和工廠(chǎng)模式 抽象類(lèi)的例子
Posted on 2005-09-22 23:12 射手座的我 雙子座的她 閱讀(1719) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): JAVA接口 Interface
沒(méi)有方法體,只有抽象方法, implements接口時(shí)候必須實(shí)現(xiàn)該接口所定義的所有的抽象方法
可以implements多個(gè)接口 用,號(hào)間隔.
抽象類(lèi) Abstract
可以有一部份實(shí)現(xiàn)方法,也可以有抽象方法,
只可以extends一個(gè)抽象類(lèi)
二者都是不可實(shí)例化
假設(shè)我們需要做一個(gè)支持多種數(shù)據(jù)庫(kù)的項(xiàng)目,但是數(shù)據(jù)庫(kù)之間有存在的差別,難道我們就要為不同的數(shù)據(jù)庫(kù)開(kāi)發(fā)不同的系統(tǒng)?答案是NO!
我們可以將多種數(shù)據(jù)庫(kù)所有的方法抽象出來(lái),寫(xiě)成一個(gè)個(gè)的方法組合到一個(gè)接口中
然后有多少種數(shù)據(jù)庫(kù)我們就寫(xiě)幾個(gè)這樣的類(lèi)實(shí)現(xiàn)這個(gè)接口
具體如下:
我們首先把所有的抽象方法組合到一個(gè)DataOperate的接口中
public interface DataOperate{
Connection createConn(); /*建立連接*/
void closeConn(); /*關(guān)閉連接*/
ResultSet getRs(); /*返回結(jié)果集*/
boolean exec(); /*執(zhí)行語(yǔ)句*/
boolean isClose(); /*公共方法 查看連接狀態(tài)*/
}
定義完接口 我們?cè)賱?chuàng)建一個(gè)抽象類(lèi) 來(lái)實(shí)現(xiàn)公共的方法isClose()
public abstract class AbstractDataOperate implements DataOperate{
public Connection createConn(){
return null;
}
public void closeConn(){
}
public ResultSet getRs(){
return null;
}
public boolean exec(){
return fasle;
}
/**
*公共方法的實(shí)現(xiàn)
**/
public boolean isClose(){
if(conn!=null)
return false;
else
return true;
}
}
接下來(lái)我們分別寫(xiě)3個(gè)類(lèi)OracleDataOperate,SqlServerDataOperate,MySqlDataOperate繼承AbstractDatOperate具體實(shí)現(xiàn)方法 這里不再敘述
好了 現(xiàn)在最后一步 寫(xiě)一個(gè)工廠(chǎng)方法來(lái)統(tǒng)一得到數(shù)據(jù)庫(kù)操作類(lèi)的實(shí)例
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 到此所有工作都完成 來(lái)測(cè)試吧
public class MyTest{
public static void main(String args[]){
DataOperate db=AbstrctDataOperate.getInstance();
db.createConn();
}
}
在MyTest類(lèi)里根本沒(méi)有出現(xiàn)OracelDataOperate、MysqlDataOperate等的影子,這就是接口的威力。客戶(hù)端不必針對(duì)OracelDataOperate等寫(xiě)不同的代碼,它只關(guān)心DataOperate即可,具體要取那個(gè)類(lèi)的邏輯就由DataOperateFactory負(fù)責(zé)了。
如果還有新的數(shù)據(jù)庫(kù)添加的話(huà) 只需要象OracleaDataOperate那樣 再寫(xiě)一個(gè)這樣類(lèi) 繼承AbstractDataOperate類(lèi) 然后在工廠(chǎng)類(lèi)里DataOperateFactory加上相應(yīng)的代碼即可