导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2008年9月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
统计
随笔 - 64
文章 - 25
评论 - 41
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔分类
Access(1)
(rss)
ASP
(rss)
J2EE 基础(3)
(rss)
Java(10)
(rss)
javascript(4)
(rss)
Jforum开源社区论坛(1)
(rss)
Linux(1)
(rss)
Lucene(1)
(rss)
MS-SQL(4)
(rss)
Mysql(12)
(rss)
oracle(4)
(rss)
Tomcat(1)
(rss)
WEB SITE(1)
(rss)
其他辅助基础(6)
(rss)
培训总结日记(1)
(rss)
有价值网站记(2)
(rss)
网络转载(3)
(rss)
轻松娱乐圈(2)
(rss)
随笔档案
2008年10月 (7)
2008年9月 (2)
2008年8月 (2)
2008年7月 (2)
2008年6月 (3)
2008年5月 (2)
2008年4月 (31)
2007年7月 (4)
2007年6月 (1)
2007年5月 (1)
2007年4月 (6)
2007年3月 (3)
文章分类
J2EE技术实例(3)
(rss)
J2EE概念理论性文摘(12)
(rss)
linux周边(1)
(rss)
Spring2.5框架(3)
(rss)
其他辅助技术(3)
(rss)
数据结构和算法(2)
(rss)
文章档案
2008年8月 (3)
2008年4月 (2)
2007年4月 (1)
2007年3月 (19)
最新随笔
1. java 数据库缓冲池 使用c3p0
2. JDBC也分2.0和3.0?
3. 鲤鱼论坛 研究笔记(未)
4. 关于正则表达式
5. Lucene倒排索引原理(转)
6. struts2标签
7. Java笔试题(部分)
8. 安装WinCVS时Python不可用的问题
9. [设计模式]jive中的[abstract Factory]
10. 题目: IOC 后台机制学习
搜索
积分与排名
积分 - 142311
排名 - 431
最新评论
1. re: 关于sql的执行计划(推荐详细)[未登录]
内容(请不要发表任何与政治相关的内容)
--A
2. re: 关于sql的执行计划(推荐详细)[未登录]
评论内容较长,点击标题查看
--lee
3. re: 关于sql的执行计划(推荐详细)
@niaomingjian
说的很好
--王振
4. re: 用存储过程搞定服务器
卧槽,楼主你搞的这个服务器怎么和我的差不多啊
--粽子
5. re: 表现层、持久层、业务层
搭搭撒撒
--打了个
阅读排行榜
1. mysql data文件夹下的ibdata1 文件作用(37390)
2. 表现层、持久层、业务层(24101)
3. 关于sql的执行计划(推荐详细)(20322)
4. java 数据库缓冲池 使用c3p0(4334)
5. 安装WinCVS时Python不可用的问题(3599)
评论排行榜
1. 关于sql的执行计划(推荐详细)(8)
2. 表现层、持久层、业务层(6)
3. .javascript.论坛(2)
4. Java入门知识(2)
5. [转]Java语言的细节(2)
[设计模式]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
金家寶
阅读(254)
评论(0)
编辑
收藏
所属分类:
Java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
struts2标签
[设计模式]jive中的[abstract Factory]
题目: IOC 后台机制学习
反向控制和面向切面编程在Spring的应用
GoF设计模式
开发者版本:你属于哪个版本的程序员?
Eclipse官方网站已经正式宣布 Eclipse 3.4发布
[转]Java语言的细节
JAVA面试题(长)
java面试30问
Powered by:
BlogJava
Copyright © 金家寶