JAVA性能優化之設計模式

**設計模式**
設計模式是前人工作的總結和提煉.通常,被人們廣泛流傳的設計模式都是對於一類問題的成熟的解決方案.如果能合理的使用設計模式,不僅系統能更容易的被人理解,同時還能是系統更加合理的結果.我就歸納了一些設計模式,能夠提升軟件性能的設計模式.
**單例模式**
單例模式是設計模式中最爲普遍的模式之一它是一種對象創建模式.用於一個對象的具體事例,它可以確保系統中一個類只會產生一個該類的實例.在java語言中,這樣行爲能帶來兩大好處:
(1)對於頻繁使用的對象,可以省略創建對象所花費的時間,這對於那些重量級對象而言是非常可觀的一筆系統開銷.
(2)由於new 操作的次數減少,因而對系統內存的使用頻率也會降低,這將減少GC壓力,縮短GC停頓時間.
因此對於系統的關鍵組件和被頻繁使用的對象,使用單例模式便可以有效的改善系統性能.
單例模式的參與者非常簡單.只有單例類和使用者兩個,
![單例模式角色](https://img-blog.csdn.net/20151211140854337)
單例模式的核心就是通過一個接口返回唯一的對象實例.
    public class Singleton{
    private Singleton(){
    System.out.println("Singleton is create ");//通過私有化構造方法
}
    private static Singleton instance =new Singleton();
    public static Singleton getinstance(){
    return instance;
}

}

序列化和反序列化可能會破會單例,一般來說,對單例進行序列化和反序列化的場景不多,但如果存在,就要多加註意

public class SerSingleton implements java.io.Serializable{
    String name;
    private SerSingleton(){
    System.out.println("Singleton is create");
    //創建單例的過程可能會比較慢
    name="SerSingleton";
    }
    private static SerSingleton instance=new SerSingleton();
public static SerSingleton getinstance(){
    return instance;
}
public static void createString(){
    System.out.println("createString in Singleton");
}
private Object readResolve(){//阻止生成新的實例,總是返回當前對象
return instance;
}
}

//測試代碼
@Test
public void test() throws Exception{
    SerSingleton s1=null;
    SerSingleton s=SerSingleton.getInstance();
    //先將實例化串行化到文件
    FileOutputStream fos=new FileOutputStream("SerSingleton.txt");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(s);
oos.flush();
oos.close();
//從文件讀出原有的單例類
FileInputStream fis=new FileInputStream("SerSingleton.txt");
ObjectOutputStream ois=new ObjectOutputStream(fis);
s1=(SerSingleton)ois.readObject();
Assert.assertEquals(s,s1);
}

使用一段代碼測試單例的串行化和反串行化,當去掉SerSingleton代碼中加粗的readReslove()方法時,以下測試代碼拋出異常:
這裏寫圖片描述
說明測試代碼中s和s1指向了不同的實例,在反序列化後,生成多個對象實例。而加上readReslove()方法的,程序正常退出.說明,即便經過反序列化,仍然保持了單例的特性.事實上,在實現私有的readReslove()方法後,readObject()已經形同虛設,它直接用readReslove()替換了原本的返回值,從而在形式上的構造了單例.
單例模式詳解
代理模式
代理模式也是一種很常見的設計模式.它使用代理對象完成用戶的請求,屏蔽了用戶對真實對象的訪問.就如同現實中的代理一樣,代理人被授權執行當事人的一些事宜,而無需當事人出面,從第三方的角度看,似乎當事人並不存在,因爲他只和代理人通信.而事實上,代理人只有當事人的授權,並且在覈心問題上還需要請示 當事人.
在現實中,使用代理的情況很普遍,而且原因也很多.比如,當事人因爲某些隱私不方便出面,或者當事人不具備某些相關的專業技能,而需要一個職業人員來完成一些專業的操作,也可能由於當事人沒有時間處理事務,而聘用代理人出面.
在軟件設計中,使用代理模式的意圖也很多,比如因爲安全問題,需要屏蔽客戶端的直接訪問真實對象,或者在遠程調用中,需要使用代理類處理遠程方法調用的技術細節(如RMI);也可以是爲了提升系統性能,對真實對象進行封裝,從而達到延遲加載的目的.通過代理模式實現延遲加載,從而提高系統的性能和反應速度.
1,代理模式的結構
這裏寫圖片描述
以上是一個簡單的示例來闡述使用代理模式來實現延遲加載的方法及其意義.假設某客戶端軟件,有根據用戶請求,去數據庫查詢數據的功能.在查詢數據前,需要獲取數據庫連接,然後軟件開始時,初始化系統的所有類,此時嘗試獲得數據庫連接.初始化系統的所有類,此時嘗試獲得數據庫連接.當前系統有大量類似操作存在時(比如xml解析等),所有這些初始化操作的疊加,會使得系統的啓動速度變得非常緩慢,爲此,使用代理模式,使用代理類,封裝對數據庫查詢中初始化操作,當系統啓動時,初始化這個代理類,而非真實的數據庫查詢類,而代理類什麼都沒有做,因此,他的構造是相當迅速的.
在系統啓動時,將消耗資源最多的方法都使用代理模式分離,就可以加快系統的啓動速度,減少用戶的等待時間.而在用戶真正做查詢操作時,再由代理類,單獨加載真實的數據庫查詢類,完成用戶的請求,這個過程就是以代理模式實現了延遲加載.
代理模式可以用於多種場合,如用於遠程調用的網絡代理,考慮安全因素的安全代理等.延遲加載只是代理模式的一種應用場景.
延遲加載的核心思想是:如果當前並沒有使用這個組件,則不需要真正的初始化它,使用一個代理對象替換它的原有位置,只有在真正需要使用的時候,纔對它進行加載.使用代理模式的延遲加載是非常有意義的, 首先,它可以在時間軸上分散系統壓力,尤其是在系統啓動時,不必完成所有的初始化工作,從而加速啓動時間,其次,很多主題而言,在軟甲你啓動直到被關閉的整個過程中,根本不會被調用,初始化這些數據無疑是一種資源浪費.顯示了使用代理類封裝數據庫查詢的 類後,系統的啓動過程.
若系統不適用代理模式,則再啓動時就要初始化DBQuery對象,而使用代理模式後,啓動時只需要初始化一個輕量級對象DBQueryProxy.
結構圖
代理模式詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章