<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    [設計模式]jive中的[abstract Factory]

      AbstractFactory模式和可擴展性
      假如要實現(xiàn)較好的可擴展性,AbstractFactory模式確實是一件利器。如上面所說,假如要創(chuàng)建的Forum接口的不同實現(xiàn),而又不想更改代碼的話,就需要用到抽象工廠了。再Jive中,AuthorizationFactory類是一個抽象類,用來創(chuàng)建Authorization對象。這是一個抽象工廠,可以通過不同的子類來創(chuàng)建不同的Authorization對象。這個工廠的實現(xiàn)方法是:
      
      在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方法來創(chuàng)建:
      
        public static Authorization getAuthorization(String username,
            String passWord) throws UnauthorizedException
        {
          loadAuthorizationFactory();
          return factory.createAuthorization(username, password);
      }
      
      不同的子類有不同的createAuthorization方法的實現(xiàn)。比如在DbAuthorizationFactory這個AuthorizationFactory的數(shù)據(jù)庫實現(xiàn)子類中,createAuthorization方法是這樣實現(xiàn)的:
      
        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);
        }
      
      在這個類中,可以看到抽象類和具體的子類之間的關系,它們是如何協(xié)作的,又是如何劃分抽象方法和非抽象方法的,這都是值得注重的地方。一般的,抽象方法需要子類來實現(xiàn),而抽象類中的非抽象方法應該所有子類所能夠共享的,或者可是說,是定義在抽象方法之上的較高層的方法。這確實是一個抽象工廠的好例子!雖然實現(xiàn)的方法已經(jīng)和GOF中給出的實現(xiàn)相差較遠了,但思想沒變,這兒的實現(xiàn),也確實是要巧妙的些。
      
      還有就是靜態(tài)方法的使用,使得這個類看起來有些Singleton的意味。這使得對于AbstractFactory的創(chuàng)建變得簡單。
      
      在AuthorizationFactory中定義的其它方法,涉及到具體的如何創(chuàng)建Authorization,都是作為abstract方法出現(xiàn),具體實現(xiàn)留給子類來完成。
      
      這樣,在需要生成一個Authorization的時候,只需要調(diào)用AuthorizationFactory的靜態(tài)方法getAuthorization就可以了,由子類實現(xiàn)了具體的細節(jié)。
      
      其它的,如同上面講到的,在創(chuàng)建Forum的時候用的ForumFactory,具有同上面一樣的實現(xiàn),這就是模式之所以稱為模式的所在了。
    資料引用:http://www.knowsky.com/365144.html

    posted on 2008-09-16 15:57 金家寶 閱讀(262) 評論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 国产a视频精品免费观看| 另类免费视频一区二区在线观看 | 嫩草影院在线播放www免费观看| 四虎免费永久在线播放| 亚洲国产精品99久久久久久| 青青草国产免费久久久下载| 亚洲第一综合天堂另类专| 免费看大黄高清网站视频在线| 精品丝袜国产自在线拍亚洲| 性一交一乱一视频免费看| 亚洲人成人伊人成综合网无码| 手机在线毛片免费播放| 亚洲精品无码专区| 免费A级毛片在线播放不收费| 无遮挡呻吟娇喘视频免费播放| 亚洲精品WWW久久久久久| 精品国产精品久久一区免费式| 亚洲伊人久久大香线蕉AV| 最好免费观看韩国+日本| 成人亚洲国产精品久久| 亚洲一区视频在线播放 | 青青青视频免费观看| 亚洲欧洲久久久精品| 暖暖免费在线中文日本| 亚洲综合精品香蕉久久网97| 久久午夜免费视频| 国产亚洲精品免费| 国产精品久久久久免费a∨| 亚洲七久久之综合七久久| 亚洲日韩VA无码中文字幕| 久久w5ww成w人免费| 亚洲va久久久久| 亚洲AV永久无码精品一区二区国产| 二区久久国产乱子伦免费精品| 久久久久亚洲精品日久生情| 日韩在线免费播放| 国产一级婬片A视频免费观看| 亚洲精品无码久久毛片波多野吉衣| 国产成人免费高清在线观看| 国产免费无码一区二区| 亚洲日韩国产欧美一区二区三区|