享元模式的主要目的是實現(xiàn)對象的共享蒲讯,即共享池劫映,當系統(tǒng)中對象多的時候可以減少內(nèi)存的開銷禽最,通常與工廠模式一起使用。
FlyWeightFactory負責創(chuàng)建和管理享元單元毛嫉,當一個客戶端請求時诽俯,工廠需要檢查當前對象池中是否有符合條件的對象,如果有承粤,就返回已經(jīng)存在的對象暴区,如果沒有,則創(chuàng)建一個新對象辛臊,F(xiàn)lyWeight是超類仙粱。
一提到共享池,我們很容易聯(lián)想到Java里面的JDBC連接池彻舰,想想每個連接的特點伐割,我們不難總結(jié)出:適用于作共享的一些個對象,他們有一些共有的屬性刃唤,就拿數(shù)據(jù)庫連接池來說隔心,url、driverClassName尚胞、username济炎、password及dbname,這些屬性對于每個連接來說都是一樣的辐真,所以就適合用享元模式來處理须尚,建一個工廠類,將上述類似屬性作為內(nèi)部數(shù)據(jù)侍咱,其它的作為外部數(shù)據(jù)耐床,在方法調(diào)用時,當做參數(shù)傳進來楔脯,這樣就節(jié)省了空間撩轰,減少了實例的數(shù)量。
看個例子:
看下數(shù)據(jù)庫連接池的代碼:
public class ConnectionPool {
private Vector<Connection> pool;
/*公有屬性*/
private String url = "jdbc:mysql://localhost:3306/test";
private String username = "root";
private String password = "root";
private String driverClassName = "com.mysql.jdbc.Driver";
private int poolSize = 100;
private static ConnectionPool instance = null;
Connection conn = null;
/*構(gòu)造方法昧廷,做一些初始化工作*/
private ConnectionPool() {
pool = new Vector<Connection>(poolSize);
for (int i = 0; i < poolSize; i++) {
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/* 返回連接到連接池 */
public synchronized void release() {
pool.add(conn);
}
/* 返回連接池中的一個數(shù)據(jù)庫連接 */
public synchronized Connection getConnection() {
if (pool.size() > 0) {
Connection conn = pool.get(0);
pool.remove(conn);
return conn;
} else {
return null;
}
}
}
通過連接池的管理堪嫂,實現(xiàn)了數(shù)據(jù)庫連接的共享,不需要每一次都重新創(chuàng)建連接木柬,節(jié)省了數(shù)據(jù)庫重新創(chuàng)建的開銷皆串,提升了系統(tǒng)的性能!