IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Java technology  >

Factory 模式的优点

一种更灵活的创建Object 的方法

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

关学民,

2002 年 6 月 04 日

最常见的构造一个Object 的方法是通过构造函数. 例: String strTemp = new String('Hello World');其实还有一种一种更灵活的创建Object 的方式---利用Factory 模式. 这是著名的'四人帮'(Gangs Of Four)的经典之作'设计模式'[(Design Pattern) 所记载的23模式之一. 它有着构造函数不可比拟的一些优点.

望文生义

对于构造函数来讲, 其名字必须和所属的类名一致. 这就往往失去了利用函数名传递更多信息的机会. 比如说我们有一个创建XML Parser 类:

public class XMLConverter() inmplements Converter {
      //创建一个缺省的 converter, Idoc Converter
    public XMLConverter () {
    …………………………….
}
//创建一个指定的 xml parser, idoc/bapi
        public XMLConverter (String xmlConverterType) {
    ………………….
        }
}

这个XMLConverter类有两个构造函数, 第一个构造函数创建一个缺省的XML converter.第二个构造函数可根据程序员的指定来创建一个 XML conveter.为了使用这个类,我们必须先读API文档,并且我们可能很难记住这两个构造函数各自的用途. 我们下面看看如何使用Factory解决这个问题:

public class XMLConverter () {
        public Converter getIdocConverter() {
        return new XML();
}
public static Converter getBapiConverter() {
    return new XMLConverter ("bapi");
}
      //创建一个缺省的 converter, Idoc Converter
private static Converter XMLConverter () {
    …………………………….
}
//创建一个指定的 xml parser, idoc/bapi
        private XMLConverter (String xmlParserType) {
    ………………….
        }
}

这个新的XMLConverter类有着两个get函数, 它们返回两个XMLConverter型的Object. 这就是典型的Factory 模式. 这两个get函数的名字清楚地告诉了我们它们各自的用途,我们不必查API文档就能明白它们的用途.请特别注意,两个构造函数都被标明为pivate.





回页首


可控制在一个JVM所能产生某类型Object的个数

大家知道生成一个数据库的Connection object 是一个非常影响程序速度的操作,所以"连接池'(connection pooling)是一个很常使用的技巧: 程序维持一定数量的Connection object, 以便不断的重用.这样一来就大大减少了产生和销毁Connection object所需的时间.这就要求我们能够控制最多可产生个Connection object. 下面我们看看如和用Factory 模式来解决这个问题:

import java.sql.*;
import java.util.*;
pulbic class ConnectionPool {
    private static final int NUM_OF_CONNECTION = 50;
    private static int counter = 0;
    private Vector connectionPool = new Vector();
    private ConnectionPool(){
}
public static Connection getConnection() throws Exception{
    Connection connection = null;
    if (connectionPool.size() < NUM_OF_CONNECTION) {
           
        connection = Class.forName("my.sql.Driver").
getConnection("dbc:oracle:thin:@192.168.100.36:1521:ora9i");
       connectionPool.add(connection);
} else {
 if(conuter < NUM_OF_CONNECTION)
  counter++;
else counter = 0;
  connection = (Connection)connectionPool.elementAT(counter% 
NUM_OF_CONNECTION );
}
return connection;
    }
}
      

上面这一小段程序展示了如何利用Factory 模式保持50个Connection Object:当Connection的数量小于指定数时,我们就不断创建Connection,直到50个Connection Object 被创建。 在这之后,我们就不断的重用这些Object。

以上笔者通过事例阐述了Factory 模式所具有的而构造函数所不所具有的两个优点,大家可在实践中加以运用。



参考资料

经典的" 设计模式" ("Design Pattern")

http://www.amazon.com/exec/obidos/ASIN/0201633612/ref=pd_sim_books/103-0169913-5607819



关于作者

author

1999-2000 英国伯明翰大学计算机系(University Of Birmingham, UK), 研究生Java实验课程指导教师(Java Workshop Tutor)
1999-2000 英国Bounville Colleage C++ 夜间课程讲师
2001.2-2001.6 日本"软银"子公司E-GOLF ( www.e-golf.co.jp) 程序员, 致力于Web Application 的开发,相关技术: Java Servlet, JSP, and JDBC.
2001.7--- 日本Appresso SpA程序员, 致力于XML Application, 相关技术: J2SE, Java Servlet, JSP, XML and JDBC.




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款