Ⅰ flyweight pattern翻譯過來為什麼是享元模式
享元(Flyweight)模式
1. Flyweight在拳擊比賽中指最輕量級,即"蠅量級",有些作者翻譯為"羽量級"。這里使用"享元模式"更能反映模式的用意。
2. Flyweight在拳擊比賽中指最輕量級,即「蠅量級」,這里翻譯為「享元」,可以理解為共享元對象(細粒度對象)的意思。提到Flyweight模式都會一般都會用編輯器例子來說明,這里也不例外。
享元模式以共享的方式高效地支持大量的細粒度對象。享元對象能做到共享的關鍵是區分內蘊狀態(Internal State)和外蘊狀態(External State)。內蘊狀態是存儲在享元對象內部並且不會隨環境改變而改變。因此內蘊狀態並可以共享。外蘊狀態是隨環境改變而改變的、不可以共享的狀態。享元對象的外蘊狀態必須由客戶端保存,並在享元對象被創建之後,在需要使用的時候再傳入到享元對象內部。外蘊狀態與內蘊狀態是相互獨立的。享元模式的應用享元模式在編輯器系統中大量使用。一個文本編輯器往往會提供很多種字體,而通常的做法就是將每一個字母做成一個享元對象。享元對象的內蘊狀態就是這個字母,而字母在文本中的位置和字模風格等其他信息則是外蘊狀態。比如,字母a可能出現在文本的很多地方,雖然這些字母a的位置和字模風格不同,但是所有這些地方使用的都是同一個字母對象。
http://www.javaeye.com/wiki/topic/428368
http://ikoo.info/posts/flyweight-pattern/
Ⅱ 享元模式一般用在哪些方面
響應模式一般用在很好的地方,而且特別好用,我們都應該非常好理解。
Ⅲ 享元模式的介紹
享元模式(英語:Flyweight Pattern)是一種軟體設計模式。它使用共享物件,用來盡可能減少內存使用量以及分享資訊給盡可能多的相似物件;它適合用於只是因重復而導致使用無法令人接受的大量內存的大量物件。通常物件中的部分狀態是可以分享。常見做法是把它們放在外部數據結構,當需要使用時再將它們傳遞給享元。
Ⅳ 享元模式為什麼享元的是兩個對象
享元模式可以理解成一組共享的對象集合,下面就是一個簡單的享元設計模式(甚至可以說是工廠模式了,呵呵,工廠模式目的是將具體創建對象的過程由工廠方法提供,用戶只需要知道抽象類型即可。但這個例子就不要糾結成工廠模式了)privateMapmap=newHashMappublicObjectget(Stringkey){if(map.containsKey(key)){returnmap.get(key);}Objectobj=newObject();map.put(key,obj);returnobj;}單例模式見下publicclassS{privatestaticSs=newS();privateS(){}publicstaticSgetInstance(){returns;}}從上面我們享元設計模式是一個類有很多對象,而單例是一個類僅一個對象;享元模式是為了節約內存空間,提升程序性能(避免大量的new操作);而單例模式則主要是出於共享狀態的目的
Ⅳ 享元模式的示例
典型的享元模式的例子為文書處理器中以圖形結構來表示字元。一個做法是,每個字形有其字型外觀, 字模 metrics, 和其它格式資訊,但這會使每個字元就耗用上千位元組。取而代之的是,每個字元參照到一個共享字形物件,此物件會被其它有共同特質的字元所分享;只有每個字元(文件中或頁面中)的位置才需要另外儲存。以下程式用來解釋上述的文件例子。這個例子用來解釋享元模式利用只載立執行立即小任務所必需的資料,因而減少內存使用量。
public enum FontEffect {
BOLD, ITALIC, SUPERSCRIPT, SUBSCRIPT, STRIKETHROUGH
}
public final class FontData {
/**
* A weak hash map will drop unused references to FontData.
* Values have to be wrapped in WeakReferences,
* because value objects in weak hash map are held by strong references. *
/
private static final WeakHashMap<FontData, WeakReference<FontData>> FLY_WEIGHT_DATA = new WeakHashMap<FontData, WeakReference<FontData>>();
private final int pointSize;
private final String fontFace;
private final Color color;
private final Set<FontEffect> effects;
private FontData(int pointSize, String fontFace, Color color, EnumSet<FontEffect> effects){ this.pointSize = pointSize;
this.fontFace = fontFace;
this.color = color;
this.effects = Collections.unmodifiableSet(effects);
}
public static FontData create(int pointSize, String fontFace, Color color, FontEffect... effects) { EnumSet<FontEffect> effectsSet = EnumSet.noneOf(FontEffect.class);
for (FontEffect fontEffect : effects) {
effectsSet.add(fontEffect);
}
// We are unconcerned with object creation cost, we are recing overall memory consumption FontData data = new FontData(pointSize, fontFace, color, effectsSet);
// Retrieve previously created instance with the given values if it (still) exists WeakReference<FontData> ref = FLY_WEIGHT_DATA.get(data);
FontData result = (ref != null) ? ref.get() : null; // Store new font data instance if no matching instance exists
if (result == null) {
FLY_WEIGHT_DATA.put(data, new WeakReference<FontData> (data));
result = data;
}
// return the single immutable with the given values
return result;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof FontData) {
if (obj == this) {
return true;
}
FontData other = (FontData) obj;
return other.pointSize == pointSize && other.fontFace.equals(fontFace) && other.color.equals(color) && other.effects.equals(effects);
}
return false;
}
@Override
public int hashCode() {
return (pointSize * 37 + effects.hashCode() * 13) * fontFace.hashCode();
}
// Getters for the font data, but no setters. FontData is immutable.
}
Ⅵ 享元模式的使用場景
如果一個應用程序使用了大量的對象,而這些對象造成了很大的存儲開銷的時候就可以考慮是否可以使用享元模式。
例如,如果發現某個對象的生成了大量細粒度的實例,並且這些實例除了幾個參數外基本是相同的,如果把那些共享參數移到類外面,在方法調用時將他們傳遞進來,就可以通過共享大幅度單個實例的數目。
Ⅶ 享元模式和單例模式的區別
元模式
Class flyWeight
{
Object get(std::string key)
{
if(m_map.containsKey(key))
{
return m_map[key];
}
Object obj;
m_map.put_back(key, obj);
return obj;
}
private:
std::map<string, object> m_map;
};
從上面我們享元設計模式是一個類有很多對象,而單例是一個類僅一個對象;享元模式是為了節約內存空間,提升程序性能(避免大量的new操作);而單例模式則主要是出於共享狀態的目的
Ⅷ 你熟悉的設計模式有哪些寫出單例模式的實現代碼
23個設計模式:
根據目的設計模式可以分為創造模式,結構模式和行為模式,創建模式用於處理對象的創建。結構模式用於處理類或對象的組合。
行為模式用於描述類或對象如何交互以及如何分配職責,創建模式用於處理對象的創建。主要包括以下五種設計模式:
工廠方法模式()
抽象工廠模式(AbstractFactoryPattern)
建造者模式(BuilderPattern)
原型模式(PrototypePattern)
單例模式(SingletonPattern)
結構模式用於處理類或對象的組合,包括以下七個設計模式:
適配器模式(AdapterPattern)
橋接模式(BridgePattern)
組合模式(CompositePattern)
裝飾者模式(DecoratorPattern)
外觀模式(FacadePattern)
享元模式(FlyweightPattern)
代理模式(ProxyPattern)
行為模式描述類或對象如何交互以及它們如何分配職責。它由以下11種設計模式組成:
責任鏈模式(Chain的ResponsibilityPattern)
命令模式(CommandPattern)
解釋器模式(InterpreterPattern)
迭代器模式(IteratorPattern)
中介者模式(MediatorPattern)
備忘錄模式(MementoPattern)
觀察者模式(ObserverPattern)
狀態模式(StatePattern)
策略模式(StrategyPattern)
模板方法模式(TemplateMethodPattern)
訪問者模式(VisitorPattern)
單例模式實現1:
公共類Singleton{
類共享實例對象
私有靜態單例;單例=零;
//私有構造函數
私有Singleton(){
系統。出去了。這是單例!!);
}
//獲取單例方法
公共同步靜態單例getInstance(){
//確定共享對象是否為空,如何空一個新對象
If(singleton==null){
singleton=newsingleton();
}
返回單例。
}
}
單例模式實現2:
公共類Singleton{
類共享實例對象實例化
=newSingleton();
//私有構造函數
私有Singleton(){
系統:出去了,這是單例!!);
}
//獲取單例方法
公共靜態單例getInstance(){
直接返回共享對象
返回單例。
}
}
(8)php享元模式擴展閱讀:
注意事項:
設計模式主要分三個類型:創建型和行為型。
Singleton:確保一個類只有一個實例,並為其提供一個全局訪問點
AbstractFactory:提供一個介面,用於創建一系列相關或相互依賴的對象,而無需指定它們的具體類。
FactoryMethod:定義一個用於創建對象的介面,並讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。
Builder:將復雜對象的構造與其表示分離,使相同的構造過程可以創建不同的表示。
Prototype:指定要使用Prototype實例創建的對象的類型,並復制該原型來創建一個新對象。
Composite:將對象組合成樹狀結構,以表示整體各部分之間的關系。組合使用戶一致地使用單個對象和組合對象。
Facade:為子系統fa中的一組介面提供一致的介面。Ade提供了一個高級介面,使子系統更易於使用。
Proxy:為其他對象提供一個代理,以控制對該對象的訪問
Adapter:將一個介面類轉換為客戶想要的另一個介面類。適配器模式使那些由於介面不兼容而無法一起工作的類一起工作。
Decrator:式比子類化更靈活,可以為對象動態添加一些額外的職責。
Bridge:模式將抽象部分與其實現部分分離,以便它們可以獨立地更改。
Flyweight:享元模式
Ⅸ c++/java/c#請高手解惑,關於設計模式中「享元模式( Flyweight )」!
對文檔編輯器,重點不是它內部狀態的共享(字元基本特徵),而是場景的共享,也就是你說的格式。
比方說:文檔編輯器用BTree結構來管理內容,它會為你在文檔中使用的每一種格式(字體、字型大小、粗斜、顏色等多項的組合)建立一個索引,為文檔中格式相同的連續字塊建立一個節點,每個節點指向一種格式索引。這樣是不是節省的大量內存呢。
當然,我上面說的還是最簡單的情況。事實上,我們將格式分為多級(比如將變化最小的字體作為第一級,變化較多的字型大小作為第二級,而將其它的作為第三級),每一級可以再建立索引,形成更加復雜的共享層次和共享組合。
而字塊節點採用了BTree,利用B樹的優點,能夠進行快速查找、索引的建立、字塊的歸並。
下面的圖可以幫你加深理解。
文本信息如下: