享元模式

享元模式的主要目的是實(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)的性能!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容