网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  jive中的abstractfactory     
  文章作者:未知  文章来源:水木森林  
  查看:98次  录入:管理员--2007-11-17  
 
  abstractfactory模式和可扩展性
  如果要实现较好的可扩展性,abstractfactory模式确实是一件利器。如上面所说,如果要创建的forum接口的不同实现,而又不想更改代码的话,就需要用到抽象工厂了。再jive中,authorizationfactory类是一个抽象类,用来创建authorization对象。这是一个抽象工厂,可以通过不同的子类来创建不同的authorization对象。这个工厂的实现方法是:
  
  在authorizationfactory中使用一个private static变量factory,用来引用具体的抽象工厂的实例:
  private static authorizationfactory factory = null;
  
  用一个private static的string,来指明具体的抽象工厂的子类类名:
  private static string classname ="com.coolservlets.forum.database.dbauthorizationfactory";
  
  然后是用一个private static的loadauthorizationfactory方法来给这个factory变量赋值,生成具体的抽象工厂类:
  
    private static void loadauthorizationfactory() {
      if (factory == null) {
        synchronized(classname) {
          if (factory == null) {
            string classnameprop = propertymanager.getproperty(
              "authorizationfactory.classname"
            );
            if (classnameprop != null) {
              classname = classnameprop;
            }
            try {
              class c = class.forname(classname);
              factory = (authorizationfactory)c.newinstance();
            }
            catch (exception e) {
              system.err.println("exception loading class: " + e);
              e.printstacktrace();
            }
          }
        }
      }
  }
  
  在static的getauthorization方法返回一个authorization的过程中,先初始化工厂类factory变量,然后用factory的createauthorization方法来创建:
  
    public static authorization getauthorization(string username,
        string password) throws unauthorizedexception
    {
      loadauthorizationfactory();
      return factory.createauthorization(username, password);
  }
  
  不同的子类有不同的createauthorization方法的实现。比如在dbauthorizationfactory这个authorizationfactory的数据库实现子类中,createauthorization方法是这样实现的:
  
    public authorization createauthorization(string username, string password)
        throws unauthorizedexception
    {
      if (username == null || password == null) {
        throw new unauthorizedexception();
      }
      password = stringutils.hash(password);
      int userid = 0;
      connection con = null;
      preparedstatement pstmt = null;
      try {
        con = dbconnectionmanager.getconnection();
        pstmt = con.preparestatement(authorize);
        pstmt.setstring(1, username);
        pstmt.setstring(2, password);
  
        resultset rs = pstmt.executequery();
        if (!rs.next()) {
          throw new unauthorizedexception();
        }
        userid = rs.getint(1);
      }
      catch( sqlexception sqle ) {
        system.err.println("exception in dbauthorizationfactory:" + sqle);
        sqle.printstacktrace();
        throw new unauthorizedexception();
      }
      finally {
        try { pstmt.close(); }
        catch (exception e) { e.printstacktrace(); }
        try { con.close();  }
        catch (exception e) { e.printstacktrace(); }
      }
      return new dbauthorization(userid);
    }
  
  在这个类中,可以看到抽象类和具体的子类之间的关系,它们是如何协作的,又是如何划分抽象方法和非抽象方法的,这都是值得注意的地方。一般的,抽象方法需要子类来实现,而抽象类中的非抽象方法应该所有子类所能够共享的,或者可是说,是定义在抽象方法之上的较高层的方法。这确实是一个抽象工厂的好例子!虽然实现的方法已经和gof中给出的实现相差较远了,但思想没变,这儿的实现,也确实是要巧妙的些。
  
  还有就是静态方法的使用,使得这个类看起来有些singleton的意味。这使得对于abstractfactory的创建变得简单。
  
  在authorizationfactory中定义的其它方法,涉及到具体的如何创建authorization,都是作为abstract方法出现,具体实现留给子类来完成。
  
  这样,在需要生成一个authorization的时候,只需要调用authorizationfactory的静态方法getauthorization就可以了,由子类实现了具体的细节。
  
  其它的,如同上面讲到的,在创建forum的时候用的forumfactory,具有同上面一样的实现,这就是模式之所以称为模式的所在了。
 
 
上一篇: swt/jface入门指南之加速开发    下一篇: 有选择地显示预加载内容提高网站的性能
  相关文档
在.net开发中几个重要的认识误区 11-17
状态栏动态提示超链接地址的效果 11-17
java socket编程(四)重复和并发服务器 11-17
javascript中的关键字“var”使用详解 11-16
经验分享:如何迅速成为java高手 11-16
利用threadlocal记录日志 11-17
用reflection实现visitor模式 11-17
如何让jbuilder9支持struts 1.1 11-17
三大工具 轻松有效的检查java程序代码 11-16
常见java开源jms消息中间件及特性简介 11-23
java实现windows中的dir/s查找实例 11-20
企业级应用开发中的java开源项目 11-17
百分之百纯java(tm)-如何翻译java名词? 11-17
java技术与xml常见问题之一般问题 11-17
管理人员如何编制性能计划 11-17
driveexists 方法 11-16
配置jsp环境的win2kadvanceserver+javasdk+apache+tomcat 11-17
java远程方法调用 11-17
高级:运用jakarta struts的七大实战心法 01-22
jcreater+motoj2sdk的配置与使用心得 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息