public Sample creator(){ ·。。。…。 return new SampleB } public Sample2 creator(String name){ ···· return new Sample2B 从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我不可 以使用两个工厂方法来分别生产Sample和Sample2? 抽象工厂还有另外一个关键要点,是因为SimpleFactory内,生产Sample和生产 Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有 其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫 SimpleFactory. 在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用, 举例<?XML:NAMESPACE PREFIX=O/><O:P></O:P> 我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过, 现在再讨论其工厂模式: public abstract class ForumFactory private static object initLock new object(); private static String className
public Sample creator(){ ...... return new SampleB } public Sample2 creator(String name){ ...... return new Sample2B } } 从上面看到两个工厂各自生产出一套 Sample 和 Sample2,也许你会疑问,为什么我不可 以使用两个工厂方法来分别生产 Sample 和 Sample2? 抽象工厂还有另外一个关键要点,是因为 SimpleFactory 内,生产 Sample 和生产 Sample2 的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有 其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫 SimpleFactory。 在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用, 举例<?XML:NAMESPACE PREFIX = O /><O:P></O:P> 我们以 Jive 的 ForumFactory 为例,这个例子在前面的 Singleton 模式中我们讨论过, 现在再讨论其工厂模式: public abstract class ForumFactory { private static Object initLock = new Object(); private static String className =
"com.jivesoftware.forum.database.DbForumFactory"; private static ForumFactory factory null; public static ForumFactory getInstance(Authorization authorization){ //If no valid authorization passed in,return null. if (authorization ==null){ return null; //以下使用了Singleton单态模式 if (factory ==null)( synchronized(initLock){ if (factory =null)( try /动态转载类 class c Class.forName(className); factory =(ForumFactory)c.newInstance(); catch (Exception e)( return null; /Now,返回proxy.用来限制授权对forum的访问 return new ForumFactoryProxy(authorization,factory
"com.jivesoftware.forum.database.DbForumFactory"; private static ForumFactory factory = null; public static ForumFactory getInstance(Authorization authorization) { //If no valid authorization passed in, return null. if (authorization == null) { return null; } //以下使用了 Singleton 单态模式 if (factory == null) { synchronized(initLock) { if (factory == null) { ...... try { //动态转载类 Class c = Class.forName(className); factory = (ForumFactory)c.newInstance(); } catch (Exception e) { return null; } } } } //Now, 返回 proxy.用来限制授权对 forum 的访问 return new ForumFactoryProxy(authorization, factory
factory.getPermissions(authorization)); //真正创建forum的方法由继承forumfactory的子类去完成, public abstract Forum createForum(String name,String description) throws UnauthorizedException,ForumAlreadyExistsException; 因为现在的Jiⅴe是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系 统实现,这个工厂方法ForumFactory就提供了提供动态接口: private static String className "com.jivesoftware.forum.database.DbForumFactory"; 你可以使用自己开发的创建forum的方法代替 com.jivesoftware.forum.database.DbForumFactory就可以. 在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及 proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人: 一个是注册用户一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿 整个系统的,因此建立一个Proy,类似网关的概念,可以很好的达到这个效果. 看看Java宠物店中的CatalogDAOFactory: public class CatalogDAOFactory
factory.getPermissions(authorization)); } //真正创建 forum 的方法由继承 forumfactory 的子类去完成. public abstract Forum createForum(String name, String description) throws UnauthorizedException, ForumAlreadyExistsException; .... } 因为现在的 Jive 是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系 统实现,这个工厂方法 ForumFactory 就提供了提供动态接口: private static String className = "com.jivesoftware.forum.database.DbForumFactory"; 你可以使用自己开发的创建 forum 的方法代替 com.jivesoftware.forum.database.DbForumFactory 就可以. 在上面的一段代码中一共用了三种模式,除了工厂模式外,还有 Singleton 单态模式,以及 proxy 模式,proxy 模式主要用来授权用户对 forum 的访问,因为访问 forum 有两种人: 一个是注册用户 一个是游客 guest,那么那么相应的权限就不一样,而且这个权限是贯穿 整个系统的,因此建立一个 proxy,类似网关的概念,可以很好的达到这个效果. 看看 Java 宠物店中的 CatalogDAOFactory: public class CatalogDAOFactory {
/** *本方法制定一个特别的子类来实现DAO模式。 *具体子类定义是在J2EE的部署描述器中。 */ public static CatalogDAO getDAO()throws CatalogDAOSysException CatalogDAO catDao null; try InitialContext ic new InitialContext(); //动态装入CATALOG DAO CLASS //可以定义自己的CATALOG DAO CLASS,从而在无需变更太多代码 /的前提下,完成系统的巨大变更。 String className =(String) ic.lookup (JNDINames.CATALOG DAO CLASS); catDao (CatalogDAO) Class.forName(className).newInstance(); catch (NamingException ne){ throw new CatalogDAOSysException(" CatalogDAOFactory.getDAO:NamingException while getting DAo type \n"+ne.getMessage()); catch (Exception se){ throw new CatalogDAOSysException(
/** * 本方法制定一个特别的子类来实现 DAO 模式。 * 具体子类定义是在 J2EE 的部署描述器中。 */ public static CatalogDAO getDAO() throws CatalogDAOSysException { CatalogDAO catDao = null; try { InitialContext ic = new InitialContext(); //动态装入 CATALOG_DAO_CLASS //可以定义自己的 CATALOG_DAO_CLASS,从而在无需变更太多代码 //的前提下,完成系统的巨大变更。 String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS); catDao = (CatalogDAO) Class.forName(className).newInstance(); } catch (NamingException ne) { throw new CatalogDAOSysException(" CatalogDAOFactory.getDAO: NamingException while getting DAO type : \n" + ne.getMessage()); } catch (Exception se) { throw new CatalogDAOSysException(
CatalogDAOFactory.getDAO:Exception while getting DAO type \n"+se.getMessage()); return catDao; CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className获 得CatalogDAOFactory具体实现子类,这个实现子类在Java宠物店是用来操作 catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自己的 子类名给与CATALOG DAO CLASS变量就可以。 由此可见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一 下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化
CatalogDAOFactory.getDAO: Exception while getting DAO type : \n" + se.getMessage()); } return catDao; } } CatalogDAOFactory 是典型的工厂方法,catDao 是通过动态类装入器 className 获 得 CatalogDAOFactory 具体实现子类,这个实现子类在 Java 宠物店是用来操作 catalog 数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自己的 子类名给与 CATALOG_DAO_CLASS 变量就可以。 由此可见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一 下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化