flyweight pattern 享元模式

2021-06-12 05:10:48 字數 3901 閱讀 2066

flyweight pattern 又稱享元模式
use sharing to support large numbers of fine-grained objects efficiently --- gof

運用共享技術有效地支援大量細粒度的物件

並不是所有的

flyweight

具體實現子類都需要被共享的,如果是不能共享的,那麼就只能是它只能被引用乙個。

concreteflyweight:

可以被共享,該物件可以被多個引用。

還是以汽車模型為例子,例如我們來建立乙個跑車的部分場景,每個賽車都有輪胎,外殼,品牌,引擎
這個部分組成,輪胎影響飄逸和剎車的效果,外殼僅僅是外觀效果,引擎影響最大速度和加速度,品牌影響可以被撞後影響。我們遊戲會有40輛車,如果構建這20輛車需要160個物件,但是我們發現這160個物件太消耗系統效能與資源了,其實有些物件是一樣的的,那麼在這個場景中,完全可以共享這些物件,那麼這樣
可以節省好多物件的構造與析構,系統犧牲一定空間來提公升效能與效率。
輪胎有:公尺其林,普利司通兩種輪胎
michelin輪胎:摩擦係數很高,漂移效果好,損耗很高
bridgestone輪胎:摩擦細數一般,漂移效果一般,損耗一般
外殼有:紅色,黑色,白色,藍色,綠色,黃色,紫色七種
品牌有:寶馬,法拉利,奧迪,賓士四種
bmw:堅固性強,被撞減速一般
ferrari: 堅固性弱,被減速大
audi:堅固性一般,被減速大
benz:堅固性一般,被減速小
引擎:法拉利研製,紅牛研製,賓士研製,寶馬研製
ferrari:速度高,加速高
redbull:速度高,加速一般
benz:速度一般,加速一般
bmw:速度一般,加速快

模擬從資料庫或者配置表裡獲得資料
function.h檔案

#include float getfriction(std::string wheelname);float getdrifting(std::string wheelname);

float getporperty(std::string wheelname);

int getpamer(std::string brandname);

float geteffect(std::string brandname);

int getmaxspeed(std::string makename);

int getacceleration(std::string makename);

function.cpp檔案

#include "function.h"float getfriction(std::string wheelname)

float getdrifting(std::string wheelname)

float getporperty(std::string wheelname)

int getpamer(std::string brandname)

float geteffect(std::string brandname)

int getmaxspeed(std::string makename)

int getacceleration(std::string makename)

flyweight.cpp

#include #include #include "function.h"class wheel

void run( );

void dodrifting( );

private:

std::string name;

float friction;

float drifting;

float firstloss;

float secondloss;

float porperty;

};void wheel::run()

} }std::cout<

}void car::drifting()

void car::accelerate(int t)

void car::collide(const car* c)

void car::showspeed()

;car* ca***ctory::getcar(std::string carname,std::string wheelname,

std::string color,std::string brandname,std::string makename)

else

shell *s;

std::map::iterator it2=ms.find(color);

if(it2==ms.end())

else

brand *b;

std::map::iterator it3=mb.find(brandname);

if(it3==mb.end())

else

engine *e;

std::map::iterator it4=me.find(makename);

if(it4==me.end())

else

return new car(carname,w,s,b,e);

}ca***ctory::~ca***ctory()

for(std::map::iterator it2=ms.begin();it2!=ms.end();)

for(std::map::iterator it3=mb.begin();it3!=mb.end();)

for(std::map::iterator it4=me.begin();it4!=me.end();) }

void collide(car* c1,car* c2)

int main(int argc,char** argv)

執行結果

如果有興趣可以繼續瀏覽該系列文章:
singleton pattern--單件模式

factory mothed pattern--工廠方法模式

abstract factory pattern--抽象工廠模式

builder pattern--建造者模式

prototype pattern--原型模式

adapter pattern--介面卡模式

bridge pattern -- 橋接模式

composite pattern -- 組合模式

decorator pattern -- 裝飾模式

flyweight pattern -- 享元模

享元模式 Flyweight Pattern

享元模式的關鍵是使用乙個稱作享元的物件為其他物件提供共享的資料,而且能夠保證使用享元的物件不能修改享元中的資料。常見的三種角色 1.享元介面 定義了享元對外公開內部資料的方法和接受外部資料的方法 2.具體的享元 實現享元介面的類,這個類的例項稱作享元物件或者享元。3.享元工廠 負責建立和管理享元,可...

Flyweight Pattern(享元模式)

享元模式的特點是,復用我們記憶體中已存在的物件,降低系統建立物件例項 的效能消耗 我們來給出個簡單的享元模式的應用前後的對比圖,大概我們就知道享元模式的重要作用了。我們這裡以繪製乙個有樣式的字型來說明吧,有的時候我們想繪製乙個純色的文字,比如紅色,那麼我們可能需要建立很多的例項,通常來說,這些 例項...

享元模式 Flyweight Pattern 介紹

享元模式實現物件的共享,從而減少記憶體分配的開銷。該模式通常和工廠模式一起使用。flyweight的目的是為了減少記憶體的消耗而出現的一種模式。因此他是一種解決實現問題的模式,而不是用來解決建模問題的。flyweight模式的幾個要點 1 物件導向很好的解決了抽象性的問題,但是作為乙個執行在機器中的...