享元模式(Flyweight)

享元模式的主要目的是實現對象的共享,即共享池,當系統中對象多的時候能夠減小內存的開銷,一般與工廠模式一塊兒使用。java

FlyWeightFactory負責建立和管理享元單元,當一個客戶端請求時,工廠須要檢查當前對象池中是否有符合條件的對象,若是有,就返回已經存在的對象,若是沒有,則建立一個新對象,FlyWeight是超類。一提到共享池,咱們很容易聯想到Java裏面的JDBC鏈接池,想一想每一個鏈接的特色,咱們不難總結出:適用於做共享的一些個對象,他們有一些共有的屬性,就拿數據庫鏈接池來講,url、driverClassName、username、password及dbname,這些屬性對於每一個鏈接來講都是同樣的,因此就適合用享元模式來處理,建一個工廠類,將上述相似屬性做爲內部數據,其它的做爲外部數據,在方法調用時,當作參數傳進來,這樣就節省了空間,減小了實例的數量mysql


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;
	java.sql.Connection conn=null;

	/*構造方法,作一些初始化工做*/  
	private ConnectionPool() throws SQLException{
		pool=new Vector<Connection>(100);
		for(int i=0;i<poolSize;i++)
		{
			try {
				Class.forName(driverClassName);
				conn =  DriverManager.getConnection(url, username, password);  
				pool.add(conn);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				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;
		}
	}
}

經過鏈接池的管理,實現了數據庫鏈接的共享,不須要每一次都從新建立鏈接,節省了數據庫從新建立的開銷,提高了系統的性能!sql

相關文章
相關標籤/搜索