Java設計模式之-享元模式

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;
        }
    }
}

通過連接池的管理,實現了數據庫連接的共享,不需要每一次都重新創建連接,節省了數據庫重新創建的開銷,提升了系統的性能!

發佈了61 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章