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

            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,具有同上面一樣的實現,這就是模式之所以稱為模式的所在了。
          資料引用:http://www.knowsky.com/365144.html

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

          主站蜘蛛池模板: 青川县| 邛崃市| 遂宁市| 筠连县| 岳阳市| 扬中市| 巴彦淖尔市| 盐城市| 石台县| 宾川县| 汉川市| 南开区| 霍林郭勒市| 霍城县| 顺昌县| 霸州市| 乐昌市| 普兰县| 久治县| 兴安盟| 阿巴嘎旗| 孟连| 大洼县| 类乌齐县| 漳平市| 中西区| 湘乡市| 清新县| 广灵县| 盐津县| 上高县| 新巴尔虎右旗| 大厂| 玛曲县| 静安区| 弥勒县| 阿克陶县| 长泰县| 河间市| 自贡市| 潢川县|