1. 程式人生 > 實用技巧 >022 --- 第26章 享元模式

022 --- 第26章 享元模式

簡述:

  享元模式:運用共享技術有效地支援大量細粒度的物件。

  享元模式包括:享元工廠類、享元介面類、具體享元類

    享元工廠類: 用來建立並管理享元介面類物件,它主要使用來確保合理地共享享元介面類,當用戶請求一個享元介面類物件時,享元工廠類物件提供一個已建立的例項或者建立一個(不存在的話)

    享元介面類:所有具體享元類的超類或介面,通過這個介面可以接受並作用於外部狀態。

    具體享元類:指那些不需要共享的享元介面類的子類,因為享元介面類共享成為可能,但它並不強制共享。

享元模式:

 1 #include <iostream>
 2 #include <map>
 3
using namespace std; 4 5 // 享元介面類 6 class CFlyweight 7 { 8 public: 9 virtual void Operation(int nExtrinsicstate) = 0; 10 }; 11 12 // 具體享元類 13 class CConcreteFlyweight : public CFlyweight 14 { 15 public: 16 virtual void Operation(int nExtrinsicstate) { cout << "具體Flyweight:" << nExtrinsicstate << endl; }
17 }; 18 19 // 不需要共享的享元子類 20 class CUnsharedConcreteFlyWeight : public CFlyweight 21 { 22 public: 23 virtual void Operation(int nExtrinsicstate) { cout << "不共享的具體Flyweight:" << nExtrinsicstate << endl; } 24 }; 25 26 // 享元工廠類 27 class CFlyweightFactory 28 { 29 private: 30 map<string
, CFlyweight*> m_mapFlyweights; 31 32 public: 33 CFlyweightFactory() 34 { 35 m_mapFlyweights.insert(make_pair("X", new CConcreteFlyweight())); 36 m_mapFlyweights.insert(make_pair("Y", new CConcreteFlyweight())); 37 m_mapFlyweights.insert(make_pair("Z", new CConcreteFlyweight())); 38 } 39 40 ~CFlyweightFactory() 41 { 42 map<string, CFlyweight*>::iterator ite = m_mapFlyweights.begin(); 43 while (ite != m_mapFlyweights.end()) 44 { 45 if((*ite).second) 46 { 47 delete (*ite).second; 48 (*ite).second = NULL; 49 } 50 51 ++ite; 52 } 53 54 m_mapFlyweights.clear(); 55 } 56 57 CFlyweight* GetFlyweight(string szKey) { return m_mapFlyweights[szKey]; } 58 }; 59 60 61 int main() 62 { 63 int nExtrinsicstate = 22; 64 65 CFlyweightFactory FlyweightFactory; 66 67 CFlyweight* fx = FlyweightFactory.GetFlyweight("X"); 68 fx->Operation(--nExtrinsicstate); 69 70 CFlyweight* fy = FlyweightFactory.GetFlyweight("Y"); 71 fy->Operation(--nExtrinsicstate); 72 73 CFlyweight* fz = FlyweightFactory.GetFlyweight("Z"); 74 fz->Operation(--nExtrinsicstate); 75 76 CUnsharedConcreteFlyWeight uf; 77 uf.Operation(--nExtrinsicstate); 78 79 system("pause"); 80 return 0; 81 }

輸出結果:

例:網站共享程式碼

程式碼如下:

 1 #include <iostream>
 2 #include <map>
 3 using namespace std;
 4 
 5 // 使用者類
 6 class CUser
 7 {
 8 private:
 9     string m_szName;
10 
11 public:
12     CUser(string szName) { m_szName = szName; }
13 
14     string GetName() { return m_szName; }
15 };
16 
17 // 網站基類(享元介面類)
18 class CWebSite
19 {
20 public:
21     virtual void Use(CUser* pUser) = 0;
22 };
23 
24 // 具體網站類(具體享元類)
25 class CConcreteWebSite : public CWebSite
26 {
27 private:
28     string m_szName;
29 
30 public:
31     CConcreteWebSite(string szName) { m_szName = szName; }
32 
33     virtual void Use(CUser* pUser) { cout << "網站分類: " + m_szName << " 使用者: " + pUser->GetName() << endl; }
34 };
35 
36 // 網站工廠類(享元工廠類)
37 class CWebSiteFactory
38 {
39 private:
40     map<string, CWebSite*> m_mapWebSites;
41 
42 public:
43     ~CWebSiteFactory()
44     {
45         map<string, CWebSite*>::iterator ite = m_mapWebSites.begin();
46         while (ite != m_mapWebSites.end())
47         {
48             if ((*ite).second)
49             {
50                 delete (*ite).second;
51                 (*ite).second = NULL;
52             }
53             ++ite;
54         }
55         m_mapWebSites.clear();
56     }
57 
58     // 獲得網站分類
59     CWebSite* GetWebSiteCategory(string szKey)
60     {
61         if (!m_mapWebSites[szKey])
62             m_mapWebSites[szKey] = new CConcreteWebSite(szKey);
63 
64         return m_mapWebSites[szKey];
65     }
66 
67     // 獲得網站分類總數
68     int GetWebSiteCount() { return m_mapWebSites.size(); }
69 };
70 
71 
72 int main()
73 {
74     CWebSiteFactory WebSiteFactory;
75 
76     CWebSite* fx = WebSiteFactory.GetWebSiteCategory("產品展示");
77     fx->Use(&CUser("GHL"));
78 
79     CWebSite* fy = WebSiteFactory.GetWebSiteCategory("產品展示");
80     fy->Use(&CUser("GGG"));
81 
82     CWebSite* fz = WebSiteFactory.GetWebSiteCategory("產品展示");
83     fz->Use(&CUser("HHH"));
84 
85     CWebSite* fl = WebSiteFactory.GetWebSiteCategory("部落格");
86     fl->Use(&CUser("LLL"));
87 
88     CWebSite* fm = WebSiteFactory.GetWebSiteCategory("部落格");
89     fm->Use(&CUser("ggg"));
90 
91     CWebSite* fn = WebSiteFactory.GetWebSiteCategory("部落格");
92     fn->Use(&CUser("hhh"));
93 
94     cout << "網站分類總數為: " << WebSiteFactory.GetWebSiteCount() << endl;
95 
96     system("pause");
97     return 0;
98 }