/********************************* *设计模式--享元模式实现 *C++语言 *Author:WangYong *Blog:http://www.cnblogs.com/newwy ********************************/ #include <iostream> #include <cassert> #include <vector> #include <string> using namespace std; class Flyweight { public: virtual ~Flyweight(){} virtual void Operation(const string & extrinsicState){} string GetIntrinsicState(){return this->_intrinsicState;} protected: Flyweight(string intrinsicState){this->_intrinsicState = _intrinsicState;} private: string _intrinsicState; }; class ConcreteFlyweight:public Flyweight { public: ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState) {cout<<"ConcreteFlyweight Build ...."<<intrinsicState<<endl;} ~ConcreteFlyweight(){} void Operation(const string & extrinsicState) { cout<<"ConcreteFlyweight:内蕴"<<this->GetIntrinsicState() <<"ConcreteFlyweight:外蕴"<<extrinsicState<<endl; } }; class FlyweightFactory { public: FlyweightFactory(){} ~FlyweightFactory(){} Flyweight * GetFlyweight(const string &key) { vector<Flyweight *>::iterator it = _fly.begin(); for(;it != _fly.end(); it++) { if( (*it)->GetIntrinsicState() == key) cout<<"already created by users..."<<endl; return *it; } Flyweight *fn = new ConcreteFlyweight(key); _fly.push_back(fn); return fn; } private: vector<Flyweight*> _fly; }; int main() { FlyweightFactory *fc = new FlyweightFactory(); Flyweight * fw1 = fc->GetFlyweight("hello"); Flyweight * fw2 = fc->GetFlyweight("world!"); Flyweight * fw3 = fc->GetFlyweight("hello"); }