熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

jive中的abstract Factory

2013-11-15 11:38:09  來源: JSP教程 

  AbstractFactory模式和可擴展性
  如果要實現較好的可擴展性AbstractFactory模式確實是一件利器如上面所說如果要創建的Forum接口的不同實現而又不想更改代碼的話就需要用到抽象工廠了再Jive中AuthorizationFactory類是一個抽象類用來創建Authorization對象這是一個抽象工廠可以通過不同的子類來創建不同的Authorization對象這個工廠的實現方法是
  
  在AuthorizationFactory中使用一個private static變量factory用來引用具體的抽象工廠的實例
  private static AuthorizationFactory factory = null;
  
  用一個private static的String來指明具體的抽象工廠的子類類名
  private static String className =olservletsforumdatabaseDbAuthorizationFactory;
  
  然後是用一個private static的loadAuthorizationFactory方法來給這個factory變量賦值生成具體的抽象工廠類
  
    private static void loadAuthorizationFactory() {
      if (factory == null) {
        synchronized(className) {
          if (factory == null) {
            String classNameProp = PropertyManagergetProperty(
              AuthorizationFactoryclassName
            );
            if (classNameProp != null) {
              className = classNameProp;
            }
            try {
              Class c = ClassforName(className);
              factory = (AuthorizationFactory)cnewInstance();
            }
            catch (Exception e) {
              Systemerrprintln(Exception loading class: + e);
              eprintStackTrace();
            }
          }
        }
      }
  }
  
  在static的getAuthorization方法返回一個Authorization的過程中先初始化工廠類factory變量然後用factory的createAuthorization方法來創建
  
    public static Authorization getAuthorization(String username
        String password) throws UnauthorizedException
    {
      loadAuthorizationFactory();
      return factorycreateAuthorization(username password);
  }
  
  不同的子類有不同的createAuthorization方法的實現比如在DbAuthorizationFactory這個AuthorizationFactory的數據庫實現子類中createAuthorization方法是這樣實現的
  
    public Authorization createAuthorization(String username String password)
        throws UnauthorizedException
    {
      if (username == null || password == null) {
        throw new UnauthorizedException();
      }
      password = StringUtilshash(password);
      int userID = ;
      Connection con = null;
      PreparedStatement pstmt = null;
      try {
        con = DbConnectionManagergetConnection();
        pstmt = conprepareStatement(AUTHORIZE);
        pstmtsetString( username);
        pstmtsetString( password);
  
        ResultSet rs = pstmtexecuteQuery();
        if (!rsnext()) {
          throw new UnauthorizedException();
        }
        userID = rsgetInt();
      }
      catch( SQLException sqle ) {
        Systemerrprintln(Exception in DbAuthorizationFactory: + sqle);
        sqleprintStackTrace();
        throw new UnauthorizedException();
      }
      finally {
        try { pstmtclose(); }
        catch (Exception e) { eprintStackTrace(); }
        try { conclose();  }
        catch (Exception e) { eprintStackTrace(); }
      }
      return new DbAuthorization(userID);
    }
  
  在這個類中可以看到抽象類和具體的子類之間的關系它們是如何協作的又是如何劃分抽象方法和非抽象方法的這都是值得注意的地方一般的抽象方法需要子類來實現而抽象類中的非抽象方法應該所有子類所能夠共享的或者可是說是定義在抽象方法之上的較高層的方法這確實是一個抽象工廠的好例子!雖然實現的方法已經和GOF中給出的實現相差較遠了但思想沒變這兒的實現也確實是要巧妙的些
  
  還有就是靜態方法的使用使得這個類看起來有些Singleton的意味這使得對於AbstractFactory的創建變得簡單
  
  在AuthorizationFactory中定義的其它方法涉及到具體的如何創建Authorization都是作為abstract方法出現具體實現留給子類來完成
  
  這樣在需要生成一個Authorization的時候只需要調用AuthorizationFactory的靜態方法getAuthorization就可以了由子類實現了具體的細節
  
  其它的如同上面講到的在創建Forum的時候用的ForumFactory具有同上面一樣的實現這就是模式之所以稱為模式的所在了
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19344.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.