工厂方法的应用2

来源:互联网 发布:linux解压缩 编辑:程序博客网 时间:2024/05/22 15:30

下面代码说的是在一个相同的棋盘上下国际象棋和西洋跳棋,
  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)模式。
工厂模式的逐步递演反映了抽象的步步加深、解决问题
其实这些问题你可以搜出来,网上很多详细讲解

原创粉丝点击