望文生义 对于构造函数来讲 其名字必须和所属的类名一致 这就往往失去了利用函数名传递更多信息的机会 比如说我们有一个创建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 javasql*; import javautil*; pulbic class ConnectionPool { private static final int NUM_OF_CONNECTION = ; private static int counter = ; private Vector connectionPool = new Vector(); private ConnectionPool(){ } public static Connection getConnection() throws Exception{ Connection connection = null; if (connectionPoolsize() < NUM_OF_CONNECTION) { connection = ClassforName(mysqlDriver) getConnection(dbc:oracle:thin:@::orai); connectionPooladd(connection); } else { if(conuter < NUM_OF_CONNECTION) counter++; else counter = ; connection = (Connection)connectionPoolelementAT(counter% NUM_OF_CONNECTION ); } return connection; } }
上面这一小段程序展示了如何利用Factory 模式保持个Connection Object当Connection的数量小于指定数时我们就不断创建Connection直到个Connection Object 被创建 在这之后我们就不断的重用这些Object 以上笔者通过事例阐述了Factory 模式所具有的而构造函数所不所具有的两个优点大家可在实践中加以运用 |