望文生義
對於構造函數來講 其名字必須和所屬的類名一致 這就往往失去了利用函數名傳遞更多信息的機會 比如說我們有一個創建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 =
;
private static int counter =
;
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:@
:
:ora
i
);
connectionPool
add(connection);
} else {
if(conuter < NUM_OF_CONNECTION)
counter++;
else counter =
;
connection = (Connection)connectionPool
elementAT(counter%
NUM_OF_CONNECTION );
}
return connection;
}
}
上面這一小段程序展示了如何利用Factory 模式保持個Connection Object當Connection的數量小於指定數時我們就不斷創建Connection直到個Connection Object 被創建 在這之後我們就不斷的重用這些Object
以上筆者通過事例闡述了Factory 模式所具有的而構造函數所不所具有的兩個優點大家可在實踐中加以運用
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27489.html