1 /*利用享元模式买衬衫的程序案例 2 需求:1、库存无某种颜色衬衫时,需要对该颜色衬衫进行进货(列表中无该属性的对象时,新建立该属性对象,再调用) 3 2、库存中有该对象时,直接售卖不用进货(列表中有该属性的对象时,直接调用) 4 程序注解:库存使用map实现的 5 售卖等行为是用cout<<相应的话语模拟实现的 6 */ 7 #include<iostream> 8 #include<string> 9 #include<map> 10 using namespace std; 11 12 //抽象享元类 13 class FlyWeight 14 { 15 public: 16 void sail() 17 { 18 19 }; 20 }; 21 22 //具体的享元类 23 class ConcreteFlyWeight:public FlyWeight 24 { 25 public: 26 ConcreteFlyWeight(string color) 27 { 28 shirtColor = color; 29 cout<<"新入库衬衫颜色"<<shirtColor<<endl; 30 }; 31 void sail() 32 { 33 cout<<"卖掉衬衫颜色为"<<shirtColor<<endl<<endl; 34 }; 35 private: 36 string shirtColor; 37 }; 38 39 //工厂类 40 class Factory 41 { 42 public: 43 ConcreteFlyWeight* factory(string color) 44 { 45 46 map<string, ConcreteFlyWeight*>::iterator iter = SHIRT_MAP.find(color); 47 if (iter!= SHIRT_MAP.end()) 48 { 49 cout<<"库存有货"<<endl; 50 ConcreteFlyWeight *it = SHIRT_MAP[color]; 51 return it; 52 } 53 else 54 { cout<<"库存无货"<<endl; 55 ConcreteFlyWeight *m_Color=new ConcreteFlyWeight(color); 56 SHIRT_MAP.insert(map<string, ConcreteFlyWeight*>::value_type(color,m_Color)); 57 ConcreteFlyWeight *it = SHIRT_MAP[color]; 58 return it; 59 } 60 61 } 62 private: 63 map<string, ConcreteFlyWeight*>SHIRT_MAP; 64 }; 65 66 //主函数 67 int main() 68 { 69 Factory m_factory; 70 71 cout<<"1号顾客买红色衬衫"<<endl; 72 ConcreteFlyWeight *m_ConcreteFlyWeight1=m_factory.factory("Red"); 73 m_ConcreteFlyWeight1->sail(); 74 75 cout<<"2号顾客买蓝色衬衫"<<endl; 76 ConcreteFlyWeight *m_ConcreteFlyWeight2=m_factory.factory("Blue"); 77 m_ConcreteFlyWeight2->sail(); 78 79 cout<<"3号顾客买红色衬衫"<<endl; 80 ConcreteFlyWeight *m_ConcreteFlyWeight3=m_factory.factory("Red"); 81 m_ConcreteFlyWeight3->sail(); 82 83 getchar();//停留输出界面,按任意键结束 84 return 0; 85 }