※ 引述《QQ29 (我爱阿蓉)》之铭言:
: 有没有更好的例子来说明这个pattern的用途
boost::flyweight 的文件里面的例子就不错囉。
假设你写一个线上游戏,里面有很多玩家,
玩家输入的名字有 first name 跟 last name。
class Player {
std::string first_name;
std::string last_name;
};
但是,你知道很多人都叫做 "Jack" "Smith",叫 "Jack" 的搞不好有好几百人,
你每个都存一份,那就很累,很浪费空间,所以你要想个办法解决这个问题,
所以我们就可以使用 flyweight,也就是我们只保存某种形式的指标,指向实体,
至于实体就放在别处,统一蒐集起来,大家共用。内存就可以只用原来的几 %。
Pattern 只是 pattern,实作方法很多,
当然用指标或是 reference 也是一种实作方法。
class Player {
std::string* first_name;
std::string* last_name;
}
但是这种实作当然有缺点,
就是操作起来跟原来的 string 比起来麻烦很多。
boost::flyweight 的设计不错,为 flyweight 提供了 value 语意。
使用起来跟原来 string 差不多,缺有节省空间的优点,推荐使用。