Chinaunix

标题: 工厂模式:面向接口编程实现抽象工厂化DAO [打印本页]

作者: wxz20032003    时间: 2007-06-17 17:07
标题: 工厂模式:面向接口编程实现抽象工厂化DAO
工厂模式:面向接口编程实现抽象工厂化DAO
例如:人员的增删改查Person
建立Person的POJO(Plain Old Java Object):
class PersonBO{}

建立Person的DAO接口:
interface PersonDAO{增删改查}

建立Person的abstract class PersonDAOFactory:
abstract class PersonDAOFactory{
static PersonDAOFactory getInstance()
{
读取数据库文件*.properties的dbname,jndi,transactionIsolation;
return (PersonDAOFactory)PersonOracleDAOFactory的实例;(符合properties文件)
}
public abstract PersonDAO getPersonDAO();
}

建立Person的OracleDAO:
class PersonOracleDAO implements PersonDAO{增删改查实现}

建立Person的OracleDAOFactory:
class PersonOracleDAOFactory extends PersonDAOFactory
{
      PersonDAO getPersonDAO()
      {
      return new PersonOracleDAO();
      }
}
关系(图3.1.4):
  
PersonOracleDAO(class)
PersonDAOFactory(abstract class)
PersonDAO(interface)
PersonOracleDAOFactory(class)
interface PersonDAO              PersonDAOFactory
        |                               |
        |                               |
        |                               |
        |                               |
class PersonOracleDAO
图3.1.4 面向接口编程实现抽象工厂化DAO

工厂模式:提供创建对象的接口,所谓工厂模式就是将对象的new过程分离出来,满足当同一个产品后来修改的需要,不会影响到其他产品。
       例子:
Sample mysample=new MySample();
Sample hissample=new HisSample();
其中Sample是MySample与HisSample的接口。
工厂方法:隐藏实现的细节。
例子:
public class Factory{

  public static Sample creator(int which){
         //getClass 产生Sample 一般可使用动态类装载装入类。

  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();
  }
}

如果要实例化Sample时.就使用
Sample sampleA=Factory.creator(1);
这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会。
抽象工厂:将Factory变成抽象类,满足工厂定制不同品种的需要(产品多样化、复杂化)。
       例子:
public abstract class Factory{
  public abstract Sample creator();
  public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
  public Sample creator(){
    .........
    return new SampleA
  }
  public Sample2 creator(String name){
    .........
    return new Sample2A
  }
}
public class BombFactory extends Factory{
  public Sample creator(){
    ......
    return new SampleB
  }
  public Sample2 creator(String name){
    ......
    return new Sample2B
  }
}
这样做的好处:
1)        通过工厂模式PersonOracleDAOFactory对PersonDAO进行定制,以适应数据库需求的变化(ORACLE和DB2),而且不同的数据库类型的DAO是不一样的。这里主要被体现在抽象工厂模式。正应了那句话:传统编码过程中,引入一个接口,往往也意味着同时要引入一个Factory类,也许还有一个额外的配置文件及其读写代码。
2)        面向接口编程,PersonDAO(interface)是PersonOracleDAO(class)的接口,接口PersonDAO定制了该DAO的功能,接口中规范了所有的功能方法,给调用着标明了自己的功能列表,是模块间实现低耦合的重要方式。




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/25102/showart_323089.html




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2