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具有同上面一样的实现这就是模式之所以称为模式的所在了 |