天天看點

C++設計模式——享元模式Flyweight-Pattern

在軟體系統采用純粹對象方案的問題在于大量細粒度的對象會很快充斥在系統中,進而帶來很高的運作時代價——主要指記憶體需求方面的代價。

如何在避免大量細粒度對象問題的同時,讓外部客戶程式仍然能夠透明地使用面向對象的方式來進行操作?

運作共享技術有效地支援大量細粒度的對象。 ——《設計模式》GoF

C++設計模式——享元模式Flyweight-Pattern

假設要設計一個字處理系統,如果每一個字元都是對象,一篇文章将會有太多對象了 但将這些字元按照字型分類,那麼僅會有幾種字型對象

面向對象很好地解決了抽象性的問題,但是作為yield運作機器中的程式實體,我們需要考慮對象的代價問題, Flyweight主要解決面向對象的大家問題,一般不觸及面向對象的抽象性問題。

Flyweight采用對象共享的做法來降低系統中對象的個數,進而降低細粒度對象給系統帶來的壓力。在具體實作方面,要注意對象狀态的處理。

對象的數量太大進而導緻對象記憶體開銷加大——什麼樣的數量才算大?這需要我們仔細的根據具體應用情況進行評估,而不能憑空臆斷。

享元模式可以避免大量非常相似的開銷。在程式設計中,有時需要生成大量細粒度的類執行個體來表示資料。如果能發現這些執行個體除了幾個參數外基本上都是相同的,有時就能夠大幅度地減少需要執行個體化的類的數量。如果能把那些參數移到類執行個體的外面,在方法調用時将它們傳遞進來,就可以通過共享大幅度地減少單個執行個體的數目。

如果一個應用程式使用了大量的對象,而這些對象造成了很大的存儲開銷時就應該考慮使用享元模式;

對象的大多數狀态可以是外部狀态,如果删除對象的外部狀态,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮用享元模式。