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