下面代碼說的是在一個相同的棋盤上下國際象棋和西洋跳棋,
interface Game{...}//game接口
interfacd GameFactory{...}gamefactory接口
class Checkers implements Game
{.
//game 的實現類
..}
class CheckersFactory implements GameFactory //gamefactory的實現類
{
public Game getGmae()
{
return new Checkers();
}
}
class Chess implements Game
{.
// game 的實現類
..}
class ChessFactory implements GameFactory //gamefactory的實現類
{
public Game getGmae()
{
return new Chess();
}
}
public class Games
{
public static void playGame(GameFactory factory)
{
Game gs=factory.getGame();
}
public static void main(String args[])
{
playGame(new CheckerFactory());
playGame(new ChessFatory());
}
}
問題提出:
問題是爲什麼要這麼麻煩,給Checkers和Chess都弄個工廠,然後從工廠裏返回類型,可以直接把public static void playGame(GameFactory factory) 改成Public static void
playGame(Game factory)不就可以了嗎?然後playGame(new CheckerFactory());
playGame(new ChessFatory());改成playGame(new Checkers()); playGame(new Chess()); 利
用向上轉型原理。這樣不是可以把上面的那些Factory代碼全刪掉麼?另外Factory模式到
底有什麼用處。
回答:
就從這個例子來看如上改動是沒有什麼問題,這兩種寫法的本質區別在於對像的產生方式不同,換名話說也就是產品不是統一由工廠生產而是各做各的.第一種寫法(即有工廠類的寫法)對像的產生是通過中間環節工廠類來產生,第二種寫法是直接在終端產生,從而傳遞對像.現在問題在於在很多情況下在產生對像的同時還需要配置一些其它的參數(比如通過讀取XML配置文件中的一些信息)來協同完成.這時如果你用第二種方法就難以實現了.但是用第一種寫法就很容易實現,只要在getGame()方法內在產生對像的同時也讀取信息就可以了.
總結:
在這個例子中其實我們還可以看到接口的作用,對於帶有不同類型參數的函數可以調用同一個方法,當然被調用的方法中的參數就應該是個接口了.這裏面隱含了對像上轉型的理論.接口的使用給我們的程序設計帶來了很大的方便.
下面這段代碼就是一個典型的工廠方法
public static Dao getDao(String dbmsName) throws UnsupportDatabaseException
{
if( dbmsName.equalsIgnoreCase( "SQL Server ") )
{ return new SqlServerDao();
}
else if( dbmsName.equalsIgnoreCase( "Oracle ") )
{
return new OracleDao();
}
else if( dbmsName.equalsIgnoreCase( "MySQL ") )
{
return new MySQLDao();
}
else {
throw new UnsupportDatabaseException(dbmsName);
}
}
其中 Dao 是 SqlServerDao、OracleDao、MySQLDao 的接口, 通過傳入的數據庫名稱來確定,並獲得不同的數據庫處理實現。若使用的數據庫並沒有實現,則進行異常處理。
這也是典型的接口應用.
------------
工廠模式負責將大量有共同接口的類實例化。工廠模式可以決定將哪一個類實例化,不必事先知道每次要實例化哪一個類。
工廠模式的幾種形態:
簡單工廠模式。又稱靜態工廠模式。
工廠方法模式。Factory Method,又稱多態工廠或虛擬構造子模式(Virtual Constructor)。
抽象工廠模式。Abstract Factory,又稱工具箱(Kit或ToolKit)模式。
工廠模式的逐步遞演反映了抽象的步步加深、解決問題
其實這些問題你可以搜出來,網上很多詳細講解