Factory模式的优点 对于构造函数来讲, 其名字必须和所属的类名一致. 这就往往失去了利用函数名传递更多信息的机会. 比如说我们有一个创建XML Parser 类: 1 public class XMLConverter() inmplements Converter { 2 3 //创建一个缺省的 converter, Idoc Converter 4 5 public XMLConverter () { 6 7 ……………………………. 8 9 } 10 11 //创建一个指定的 xml parser, idoc/bapi 12 13 public XMLConverter (String xmlConverterType) { 14 15 …………………. 16 17 } 18 19 } 20 21 这个XMLConverter类有两个构造函数, 第一个构造函数创建一个缺省的XML converter.第二个构造函数可根据程序员的指定来创建一个 XML conveter.为了使用这个类,我们必须先读API文档,并且我们可能很难记住这两个构造函数各自的用途. 我们下面看看如何使用Factory解决这个问题: 1 public class XMLConverter () { 2 3 public Converter getIdocConverter() { 4 5 return new XML(); 6 7 } 8 9 public static Converter getBapiConverter() { 10 11 return new XMLConverter ("bapi"); 12 13 } 14 15 //创建一个缺省的 converter, Idoc Converter 16 17 private static Converter XMLConverter () { 18 19 ……………………………. 20 21 } 22 23 //创建一个指定的 xml parser, idoc/bapi 24 25 private XMLConverter (String xmlParserType) { 26 27 …………………. 28 29 } 30 31 } 32 33 这个新的XMLConverter类有着两个get函数, 它们返回两个XMLConverter型的Object. 这就是典型的Factory 模式. 这两个get函数的名字清楚地告诉了我们它们各自的用途,我们不必查API文档就能明白它们的用途.请特别注意,两个构造函数都被标明为pivate. 可控制在一个JVM所能产生某类型Object的个数 大家知道生成一个数据库的Connection object 是一个非常影响程序速度的操作,所以"连接池'(connection pooling)是一个很常使用的技巧: 程序维持一定数量的Connection object, 以便不断的重用.这样一来就大大减少了产生和销毁Connection object所需的时间.这就要求我们能够控制最多可产生个Connection object. 下面我们看看如和用Factory 模式来解决这个问题: 1 import java.sql.*; 2 3 import java.util.*; 4 5 pulbic class ConnectionPool { 6 7 private static final int NUM_OF_CONNECTION = 50; 8 9 private static int counter = 0; 10 11 private Vector connectionPool = new Vector(); 12 13 private ConnectionPool(){ 14 15 } 16 17 public static Connection getConnection() throws Exception{ 18 19 Connection connection = null; 20 21 if (connectionPool.size() < NUM_OF_CONNECTION) { 22 23 connection = Class.forName("my.sql.Driver"). 24 25 getConnection("dbc:oracle:thin:@192.168.100.36:1521:ora9i"); 26 27 connectionPool.add(connection); 28 29 } else { 30 31 if(conuter < NUM_OF_CONNECTION) 32 33 counter++; 34 35 else counter = 0; 36 37 connection = (Connection)connectionPool.elementAT(counter% 38 39 NUM_OF_CONNECTION ); 40 41 } 42 43 return connection; 44 45 } 46 47 } 48 上面这一小段程序展示了如何利用Factory 模式保持50个Connection Object:当Connection的数量小于指定数时,我们就不断创建Connection,直到50个Connection Object 被创建。 在这之后,我们就不断的重用这些Object。 以上笔者通过事例阐述了Factory 模式所具有的而构造函数所不所具有的两个优点,大家可在实践中加以运用。 |