天天看點

設計模式複習-享元模式

設計模式複習-享元模式
#pragma once
#include "stdafx.h"
#include<map>
#include<set>
#include<string>
#include<iostream>
using namespace std;

/*
  設計模式-享元模式(Flyweight)
  運用共享技術有效地支援大量細粒度的對象。
*/

class CFlyweight {//所有具體享元的超類或接口。通過這個接口,Flyweight可以接受并作用域外部狀态。
public:
  virtual void Operation(const int &nExtrinsicstat) = 0;
};

class CConcreteFlyweight :public CFlyweight {//為内部狀态增加存儲空間。
public:
  void Operation(const int &nExtrinsicstate) {
    cout << "ju ti Flyweight:" << nExtrinsicstate << endl;
  }
};

class CUnsharedconcreteFlyweight :public CFlyweight {
public:
  void Operation(const int &nExtrinsicstate) {
    cout << "bu gong xiang de ju ti Flyweight:" << nExtrinsicstate << endl;
  }
};

class CFlweightFactory {//享元工廠,用來建立并管理Flyweight對象。
private:
  map<string, CFlyweight*>mmpFlyweight;
public:
  CFlweightFactory() {
    mmpFlyweight.clear();
    mmpFlyweight["X"] = new CConcreteFlyweight();
    mmpFlyweight["Y"] = new CConcreteFlyweight();
    mmpFlyweight["Z"] = new CConcreteFlyweight();
  }
  ~CFlweightFactory() {
    delete mmpFlyweight["X"];
    delete mmpFlyweight["Y"];
    delete mmpFlyweight["Z"];
  }
  CFlyweight * GetFlyweight(string strKey) {
    return mmpFlyweight[strKey];
  }
};


int main() {

  int nExtrinsicstate = 10;
  CFlweightFactory *pFac = new CFlweightFactory();

  CFlyweight *pNowFlyweight = pFac->GetFlyweight("X");
  pNowFlyweight->Operation(--nExtrinsicstate);

  pNowFlyweight = pFac->GetFlyweight("Y");
  pNowFlyweight->Operation(--nExtrinsicstate);

  pNowFlyweight = pFac->GetFlyweight("Z");
  pNowFlyweight->Operation(--nExtrinsicstate);

  pNowFlyweight = new CUnsharedconcreteFlyweight();
  pNowFlyweight->Operation(--nExtrinsicstate);

  delete pFac, delete pNowFlyweight;
  
  getchar();
  return 0;
}