設計模式(享元模式)

一、簡介

享元模式是設計模式中少數幾個已提高系統性能爲目的模式之一。它的核心思想是:如果系統存在多個
相同的對象,那麼只需要共享一分對象的拷貝,而不必爲每一次使用都創建新的對象。

二、使用場景及優點

當有對象被大量複用時,特別是重量級的對象複用可以使用享元模式來提高系統性能。其優點如下:
1.可以節省重複創建對象的開銷,因爲被享元模式維護的相同對象只會被創建一次,當創建對象比
     較耗時時,變可以節省大量時間。
2.由於創建的對象數減少,系統內存需求也減小了,這對GC的壓力也相應的降低了,進而使系統
     有一個健康的內存結構和更快的反應熟讀。

三、常見表現形式

享元模式共分三部分:享元工廠、業務接口、業務實現,其中享元工廠是其核心,是享元模式的精髓所在。
1.業務接口
public interface ICloudService{
    /**
     * 獲取server服務
     */
    Object getCloudStoreServer();
    
    /**
     * 獲取存儲空間
     */
    Object getMyStoreInfo(String account);
    
}
2.業務實現
public class CloudServiceImp implements ICloudService{

    String serverCode = null;
    
    Object server = null;
    
    public CloudServiceImp(String serverCode){
        this.serverCode = serverCode;
        
        /*
         * 初始化server對象,如鏈接遠端服務、查詢數據庫、解析xml等動態實例化工作。
         */
        server = (Object)"Cloud server : 115, 221.43.29.38, ....";
    }
    
    @Override
    public Object getCloudStoreServer()
    {
        return server;
    }

    @Override
    public Object getMyStoreInfo(String account)
    {
        return (Object)account+" space:hourse for me, total 2028M, used 1320M, ....";
    }

}
3.享元工廠
/*
 * 享元工廠是享元模式的核心,確保系統可以共享相同的對象。
 */
public class CloudServerFactory{

    private Map<String,ICloudService> cloudService = new HashMap<String,ICloudService>();
   
    public ICloudService getCloudServer(String serverCode)
    {
        ICloudService server = cloudService.get(serverCode);
        if(server == null)
        {
            //通過serverCode共享server服務器服務,避免相同的服務器服務被多次創建
            server = new CloudServiceImp(serverCode);
            cloudService.put(serverCode,server);
        }
        return server;
    }
}

四、測試

public class FlyWeightTest{
    
    @Test
    public void flyWeight(){
        CloudServerFactory factory = new CloudServerFactory();
        ICloudService service = factory.getCloudServer("0014440");
        
        Object serverInfo = service.getCloudStoreServer();
        Object mySp = service.getMyStoreInfo("zhangsan");
        
        System.out.println(serverInfo.toString());
        System.out.println(mySp.toString());
        
    }
}




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