第二十六章 專案多也別傻做--享元模式
26.1 專案多也別傻做
比如現在的大型的部落格**,電子商務**,裡面每乙個部落格或商家也可以理解為乙個小的**。利用使用者id號的不同來區分不同的使用者,具體資料和模板可以不同,但**核心和資料庫確是共享的。
26.2 享元模式
運用共享技術有效地支援大量細粒度的物件。
#pragma once
#include #include class flyweight;};
class concreteflyweight : public flyweight;};
class unsharedflyweight : public flyweight;};
class flyweightfactory
; ~flyweightfactory()
flyweight* getflyweight(char key)
;private:
stdext::hash_mapm_hashtable;
};
客戶端
flyweight類,它是所有具體享元類的超類或介面,通過這個介面,flyweight可以接受並作用於外部狀態。
concreteflyweight是繼承flyweight超類或實現flyweight介面,並為內部狀態增加儲存空間。
unsharedconcreteflyweight是指那些不需要共享的flyweight子類,因為flyweight介面共享成為可能,但他不強制共享。有它的存在解決了那些不需要共享物件的問題。
flyweightfactory是乙個享元工廠,用來建立並管理flyweight物件。它主要是用來確保合理地共享flyweight,當使用者請求乙個flyweight時,flyweightfactory物件提供乙個已建立的例項或者建立乙個新的例項。
26.3 **共享**
#pragma once
#include #include #include //**抽象類
class website;};
//具體**類
class concretewebsite : public website
; void use(void)
;private:
std::string m_name;
};//**工廠
class websitefactory
return (website*)m_hashtable[key];
}; //獲得**分類的總數
int getwebsitecount()
~websitefactory()
}m_hashtable.clear();
}private:
stdext::hash_mapm_hashtable;
stdext::hash_map::iterator m_ha****er;
};
客戶端:
#include "stdafx.h"
#include "website.h"
int _tmain(int argc, _tchar* argv)
這樣寫算是基本實現了享元模式的共享物件的目的,也就是說,不管建幾個**,只要是"產品展示",都是一樣的,只要是blog,也是完全相同的。所以上面的**只體現了它們共享的部分而沒有體現物件之間的不同成分。
26.4 內部狀態與外部狀態
享元模式的內部狀態:不會隨環境改變而改變的共享部分。享元模式的內部狀態儲存於concreteflyweight中。
享元模式的外部狀態:隨著環境的改變而改變的,不可以共享的狀態就是外部狀態了。
享元模式可以避免大量的非常相似類的開銷。在程式設計中,有時需要生成大量細粒度的類例項來表示資料。如果能發現這些例項除了幾個引數外基本上都是相同的,有時就能夠受大幅度地減少需要例項化的類的數量。如果能把那些引數移到類例項的外面,在方法呼叫時將它們傳遞進來,就可以通過共享大幅度地減少單個例項的數目。
在上面的例子中,客戶的帳號就是外部狀態,應該由專門的物件來處理。
//使用者
class user
; std::string getuser(void)
;private:
std::string m_name;
};//**類,**工廠類等等。其他的**同26.3
客戶端:
#include "stdafx.h"
#include "website.h"
int _tmain(int argc, _tchar* argv)
由於用了享元模式,哪怕你接手了1000個**的需求,只要要求相同或類似,你的實際開發**也就是分類的那幾種。
26.5 享元模式應用
如果乙個應用程式使用了大量的物件,而大量的這些物件造成了很大的儲存開銷時就應該考慮使用,還有就是物件的大多數狀態可以外部狀態,如果刪除物件的外部狀態,那麼可以用相對較少的共享物件取代很多組物件,此時可以考慮使用享元模式。有了共享物件,例項總數就大大減少了,節約量隨著共享狀態的增多而增大。
雖說享元模式更多的時候是一種底層的設計模式,但現實世界中也是有應用的。比如說休閒遊戲開發中,像圍棋,五子棋,跳棋等,棋子的顏色是不會變化的,所以這個時候棋子就是內部狀態,而棋子的方位座標應該就是棋子的外部狀態。
使用享元模式需要維護乙個記錄了系統已有的所有享元的列表,而本身需要耗費資源,另外享元模式也會使得系統變得更加複雜。因此應當在有足夠多的物件例項可供共享的時候才值得使用享元模式。
大話設計模式二十六 享元模式(專案多也別傻做)
享元模式 運用共享技術有效地支援大量細粒度的物件。抽象類 public abstract class website 具體 類 public class concretewebsite extends website override public void use user u public st...
演算法導論 第二十六章最大流
一,概念 1 流網路 簡單有向圖,且有兩個特別的頂點 源點s,匯點t 2 流的邊標識為f u,v c u,v 流量 容量 3 流的三個性質 1 容量限制 對於所有邊 流量 容量 2 反對稱性 f u,v f v,u 3 流守恆性 正向流與反響流之和為零 4 割 流網路g v,e 的割 s,t 將頂點...
《佛密諸事》第二十六章 靜與宇宙
一 靜的心理作用 大凡修煉的人都在 靜 字上下功夫,不難說 靜 在修煉中的重要性。靜,是人的思維間歇,人的意念達到零點。在零點上是乙個水準,是乙個關鍵性 重要性 特異性的水準。靜零點絕不是低層次,而是高層次,這個層次蘊藏著騰飛,向沸點邁進。人的思維總是不停頓的分移的至轉化,這樣形成理智思維和混淆思維...