享元模式的主要目的是實(shí)現(xiàn)對象的共享,即共享池,當(dāng)系統(tǒng)中對象多的時(shí)候可以減少內(nèi)存的開銷,通常與工廠模式一起使用。
FlyWeightFactory負(fù)責(zé)創(chuàng)建和管理享元單元,當(dāng)一個(gè)客戶端請求時(shí),工廠需要檢查當(dāng)前對象池中是否有符合條件的對象,如果有,就返回已經(jīng)存在的對象,如果沒有,則創(chuàng)建一個(gè)新對象,F(xiàn)lyWeight是超類。一提到共享池,我們很容易聯(lián)想到Java里面的JDBC連接池,想想每個(gè)連接的特點(diǎn),我們不難總結(jié)出:適用于作共享的一些個(gè)對象,他們有一些共有的屬性,就拿數(shù)據(jù)庫連接池來說,url、driverClassName、username、password及dbname,這些屬性對于每個(gè)連接來說都是一樣的,所以就適合用享元模式來處理,建一個(gè)工廠類,將上述類似屬性作為內(nèi)部數(shù)據(jù),其它的作為外部數(shù)據(jù),在方法調(diào)用時(shí),當(dāng)做參數(shù)傳進(jìn)來,這樣就節(jié)省了空間,減少了實(shí)例的數(shù)量。
看個(gè)例子:
看下數(shù)據(jù)庫連接池的代碼:
[java] view plain copy
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);
}
/* 返回連接池中的一個(gè)數(shù)據(jù)庫連接 */
public synchronized Connection getConnection() {
if (pool.size() > 0) {
Connection conn = pool.get(0);
pool.remove(conn);
return conn;
} else {
return null;
}
}
}
通過連接池的管理,實(shí)現(xiàn)了數(shù)據(jù)庫連接的共享,不需要每一次都重新創(chuàng)建連接,節(jié)省了數(shù)據(jù)庫重新創(chuàng)建的開銷,提升了系統(tǒng)的性能!