【转】工厂模式面向接口编程

为了实现更好的灵活性  
  应改面向接口编程。因此,应该面向接口提供工场。  
   
  比如,Cat,   Dog,   Mouse,都是4条腿会跑的动物。  
  因此,我们建立一个接口叫做FourLegs  
  interface   FourLegs   {  
    void   run();  
  }  
   
  我们可能需要一个实验使用一个会跑得动物  
  比如,我们要一个发电机,但是不管什么  
  只要会跑得动物都可以来发电  
   
  class   ElectricProducer   {  
      void   produceBy(FourLegs   fourLegs){  
          ...dosomething..  
        fourLegs.run();  
      }  
  }  
   
  我们需要一个工场来管理动物的创建,因为有可能增加很多动物。  
  OCP原则,就是说,对类的扩展要open类,对类的修改要close  
   
  class   FourLegFactory{  
      FourLegFactory   factory()   {  
          return   ...  
      }  
  }  
   
  这里面factory的实现可以是通过配置文件,也可以是通过参数等等  
  反正是产生了一个Cat,Dog或者Mouse的实例。这我们不关注是什么  
   
  Client代码{  
  FourLeg   fourLeg   =   FourLegFactory.factroy();  
  ElectricProducer.produceBy(fourLeg)  
  }  
   
  这样我们的发电机正常运作了  
  而且通过修改某种系统设置,可以更换任何一种动物来帮忙发电  
   
  试想,如果我们用FourLeg   fourLeg   =   new   Mouse();  
  那么一旦许要换成Cat,还需要修改Client的代码。  
   
  这就是simple   factory

原文:http://www.cnblogs.com/min10/archive/2008/10/17/1313632.html

下面是另一篇相关的文章:

 

去年“面向对象程序设计”课程的最后一道大题是用“类工厂”模式实现一个数据库组件。“类工厂”的类里对于不同数据库类型的处理是用switch...case语句来实现的,但这不符合面向对象的设计原则。如:工厂里只判断了两种数据库类型,如果再增加一个数据库类型势必要改写“类工厂”的代码(即,再加一条case语句)。问题是:如何利用合理的设计方法改善这种弊端。

 

     今天有研一的同事问起我,正好我对这个也是云里雾里。顺便问了一下高手,具体实现了出来。与大家共勉。

大的方向是利用“面向接口编程”的理论来实现。

 

     首先,定义一个接口,接口里写了一些抽象的方法。如:得到数据库连接,根据sql语句得到结果集。

 

     第二,定义不同数据库类型对接口中的抽象方法的具体实现的类。如:OracleAccess,SqlAccess。这些类中一定包含与上面接口中的抽象方法具有相同签名的方法。方法中有具体实现功能代码。

 

     第三,定义“类工厂”,“类工厂”中的构造方法需要有一个入参,即,数据库类型(dbType)。还要有一个得到具体类的实例的方法。

 

     第四,如果你不嫌麻烦,还可以写一个读取配置文件的类。当然不写也可以。

 

     第五,编辑一个配置文件,我这里用的是.properties文件。文件中就是key和value对应的关系。如:oracle=OracleAccess。其中,value就是要返回的实例的类名称。

 

 好了,现在看看各类的具体代码。这里为了方便起见,我用的返回不同字符串的方法。没有用数据库的操作。

 

  1、接口:

    public interface IDBAccess {
       public String getString();
    }

 

  2、实现接口的具体类:

    public class OracleAccess implements IDBAccess{
       public OracleAccess(){
  
       }
       public String getString(){
             String conn = "oracle instance";
             return conn;
       }
    }

    public class SqlAccess implements IDBAccess{
       public SqlAccess(){
  
       }
       public String getString(){
             return "sql instance";
       }
    }

 

  3、类工厂

    public class DBFactory {
       private String instance;
       public DBFactory(String dbType){
                  instance = (String)ConstantLib.getInstance().context.get(dbType);
               }
               public IDBAccess getInstance() throws Exception{
                      IDBAccess dbInstance = (IDBAccess)((Class.forName(instance)).newInstance());
                      return dbInstance;
              }
         }

 

  4、配置文件的编辑

    oracle=OracleAccess
    sql=SqlAccess

 

  5、现在可以写一个测试程序了,看看能不能运行。

    public class test {
                public static void main(String args[]) throws Exception{
                       DBFactory dbFactory = new DBFactory("sql");
                       IDBAccess instance = dbFactory.getInstance();
                       System.out.println(instance.getString());
               }
         }

 

看看能不能输出sql instance这个字符串,把工厂的入参该成oracle试试。能不能输出oracle instance这个字符串。

地址:http://blog.163.com/wu_qihui/blog/static/91489033201106103241593/

 

问题:如果某个接口被多个对象实现,那么如何动态实例化对象

 

posted on 2014-11-18 09:32  Leon-LYH  阅读(243)  评论(0编辑  收藏  举报

导航