概述
场景
结构
示例1
Flyweight.cpp
1 class Font { 2 private: 3 4 //unique object key 5 string key; 6 7 //object state 8 //.... 9 10 public: 11 Font(const string& key){ 12 //... 13 } 14 }; 15 16 class FontFactory{ 17 private: 18 map<string,Font* > fontPool; 19 20 public: 21 Font* GetFont(const string& key){ 22 23 map<string,Font*>::iterator item=fontPool.find(key); 24 25 if(item!=footPool.end()){ 26 return fontPool[key]; 27 } 28 else{ 29 Font* font = new Font(key); 30 fontPool[key]= font; 31 return font; 32 } 33 34 } 35 36 void clear(){ 37 //... 38 } 39 };
示例2
1 // 享元类包含一个树的部分状态。这些成员变量保存的数值对于特定树而言是唯一 2 // 的。例如,你在这里找不到树的坐标。但这里有很多树木之间所共有的纹理和颜 3 // 色。由于这些数据的体积通常非常大,所以如果让每棵树都其进行保存的话将耗 4 // 费大量内存。因此,我们可将纹理、颜色和其他重复数据导出到一个单独的对象 5 // 中,然后让众多的单个树对象去引用它。 6 class TreeType is 7 field name 8 field color 9 field texture 10 constructor TreeType(name, color, texture) { ... } 11 method draw(canvas, x, y) is 12 // 1. 创建特定类型、颜色和纹理的位图。 13 // 2. 在画布坐标 (X,Y) 处绘制位图。 14 15 // 享元工厂决定是否复用已有享元或者创建一个新的对象。 16 class TreeFactory is 17 static field treeTypes: collection of tree types 18 static method getTreeType(name, color, texture) is 19 type = treeTypes.find(name, color, texture) 20 if (type == null) 21 type = new TreeType(name, color, texture) 22 treeTypes.add(type) 23 return type 24 25 // 情景对象包含树状态的外在部分。程序中可以创建数十亿个此类对象,因为它们 26 // 体积很小:仅有两个整型坐标和一个引用成员变量。 27 class Tree is 28 field x,y 29 field type: TreeType 30 constructor Tree(x, y, type) { ... } 31 method draw(canvas) is 32 type.draw(canvas, this.x, this.y) 33 34 // 森林(Forest)类是享元的客户端。 35 class Forest is 36 field trees: collection of Trees 37 38 method plantTree(x, y, name, color, texture) is 39 type = TreeFactory.getTreeType(name, color, texture) 40 tree = new Tree(x, y, type) 41 trees.add(tree) 42 43 method draw(canvas) is 44 foreach (tree in trees) do 45 tree.draw(canvas)
参考
https://refactoringguru.cn/design-patterns/flyweight
原文:https://www.cnblogs.com/cxc1357/p/12312560.html