Java設計模式之-享元模式
享元模式的主要目的是實現對象的共享,即共享池,當系統中對象多的時候可以減少內存的開銷,通常與工廠模式一起使用,類圖如下:
FlyWeightFactory負責創建和管理享元單元,當一個客戶端請求時,工廠需要檢查當前對象池中是否有符合條件的對象,如果有,就返回已經存在的對象,如果沒有,則創建一個新對象,FlyWeight是超類。一提到共享池,我們很容易聯想到Java裏面的JDBC連接池,想想每個連接的特點,我們不難總結出:適用於作共享的一些個對象,他們有一些共有的屬性,就拿數據庫連接池來說,url、driverClassName、username、password及dbname,這些屬性對於每個連接來說都是一樣的,所以就適合用享元模式來處理,建一個工廠類,將上述類似屬性作爲內部數據,其它的作爲外部數據,在方法調用時,當做參數傳進來,這樣就節省了空間,減少了實例的數量。
示例代碼如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Vector;
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;
// 構造方法,做一些初始化工作
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);
}
// 返回連接池中的一個數據庫連接
public synchronized Connection getConnection(){
if(pool.size()>0){
Connection conn=pool.get(0);
pool.remove(conn);
return conn;
}else {
return null;
}
}
}
通過連接池的管理,實現了數據庫連接的共享,不需要每一次都重新創建連接,節省了數據庫重新創建的開銷,提升了系統的性能!