一、UML圖
二、概念
享元模式(Flyweight):運用共享技術有效地支持大量細粒度的對象。
flyweight的意思:輕量級。
三、說明
角色:
(1)Flyweight類:它是所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受並作用於外部狀態。
(2)ConcreteFlyweight類:繼承Flyweight超類或實現Flyweight接口,並為內部狀態增加存儲空間。
(3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子類。因為Flyweight接口共享成為可能,但是它並不強制共享。
(4)FlyweightFactory:是一個享元工廠,用來創建並管理Flyweight對象。它主要是用來確保合理地共享Flyweight,當用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話)。
用享元模式的好處?
享元模式可以避免大量非常相似類的開銷。在程序設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例除了幾個參數外基本上都是相同的,有時就能夠大幅度的減少需要實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳遞進來,就可以通過共享大幅度地減少單個實例的數目。
也就是說,享元模式Flyweight執行時所需的狀態是有內部的也可能有外部的,內部狀態存儲於ConcreteFlyweight對象之中,而外部對象則應該考慮由客戶端對象存儲或計算,當調用Flyweight對象的操作時,將該狀態傳遞給它。
什麼時候用享元模式?
如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。
四、C++實現
(1)Flyweight.h
#ifndef FLYWEIGHT_H #define FLYWEIGHT_H #include#include #include
(2)Client.cpp
#include "Flyweight.h" #include#include //Client,客戶端 void main() { WebSiteFactory f; WebSite* fx=f.GetWebSiteCategory("產品展示"); fx->Use(User("小菜")); WebSite* fy=f.GetWebSiteCategory("產品展示"); fy->Use(User("大鳥")); WebSite* fz=f.GetWebSiteCategory("產品展示"); fz->Use(User("嬌嬌"));www.Bkjia.com WebSite* fl=f.GetWebSiteCategory("博客"); fl->Use(User("老頑童")); WebSite* fm=f.GetWebSiteCategory("博客"); fm->Use(User("桃谷六仙")); WebSite* fn=f.GetWebSiteCategory("博客"); fn->Use(User("南海鳄神")); std::cout<<"得到網站分類總數:"<
(3)運行截圖