設計模式(享元模式)

1、簡介

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

2、使用場景及優勢

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

3、常見表現形式

享元模式共分三部分:享元工廠、業務接口、業務實現,其中享元工廠是其核心,是享元模式的精髓所在。
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.享元工廠ide

/*
 * 享元工廠是享元模式的核心,確保系統能夠共享相同的對象。
 */
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;
    }
}

4、測試

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());
        
    }
}
相關文章
相關標籤/搜索