设计模式 Design Parttern ——享元模式FlyWeight http://blog.csdn.net/leeidea/ 1:头文件 #ifndef _FLYWEIGHT_H_VANEY_ #define _FLYWEIGHT_H_VANEY_ #include <iostream> using namespace std; /****************************************************************** 名称 :Flyweight.h 版本 :1.00 描述 :演示享元模式的概念 作者 :vaney.li@gmail.com http://blog.csdn.net/leeidea 日期 :2010年10月21日 版权 :vaney.li@gmail.com http://blog.csdn.net/leeide ******************************************************************/ /* 官方解释:The Flyweight uses sharing to support large numbers of objects efficiently. 我的理解:建一个POOL,里面放置很多需要消耗的零件,需要的时候就去取,如果取完了就增大POOL的容量 我的应用:线程池,内存池等 */ //抽象零件 class CFlyWeightItem { public: CFlyWeightItem() { cout << "CFlyWeightItem()" << endl; } virtual ~CFlyWeightItem() { cout << "~CFlyWeightItem()" << endl; } public: virtual void name() = 0; }; //具体零件 class CItem1 : public CFlyWeightItem { public: CItem1() { cout << "CItem1()" << endl; } virtual ~CItem1() { cout << "~CItem1()" << endl; } public: virtual void name() { cout << "CItem1 name()" << endl; } }; #define MAX_CAPABILITY 10 //零件池 class CPool { CFlyWeightItem* items[MAX_CAPABILITY]; int size; public: CPool(int capability):size(0) { for(int i = 0; i < capability && i < MAX_CAPABILITY -1; i++) { size ++; items[i] = new CItem1(); } cout << "CPool()" << endl; } virtual ~CPool() { cout << "~CPool()" << endl; } public: //取ITEM CFlyWeightItem* Fetch() { if(size) return items[size-- - 1]; else { //可以自由增长行 cout << "no available item" << endl; } cout << "CPool Fetch" << endl; } //还ITEM void Return(CFlyWeightItem* item) { if(item) { items[size - 1] = item; //可以自由增长行 cout << "CPool Return" << endl; } } }; #define C_API extern "C" //用户 C_API int UsingFW(); #endif 2:源文件 #include "Flyweight.h" C_API int UsingFW() { CPool* pool = new CPool(5); //从POOL中取 CFlyWeightItem* item1 = pool->Fetch(); CFlyWeightItem* item2 = pool->Fetch(); //还回POOL pool->Return(item2); //又取一个,此时item2 == item3; CFlyWeightItem* item3 = pool->Fetch(); return 1; } 3:用户文件main.c extern int UsingFW(); //系统默认入口 int _tmain(int argc, _TCHAR* argv[]) { return UsingFW(); }