下面代码说的是在一个相同的棋盘上下国际象棋和西洋跳棋,
  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 的接口, 通过传入的数据库名称来确定,并获得不同的数据库处理实现。若使用的数据库并没有实现,则进行异常处理。
这也是典型的接口应用.