目录
运用共享技术有效地支持大量细粒度的对象。

描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。
实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。
并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。
FlyweightFactory
创建并管理flyweight对象。
确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。
Client
维持一个对flyweight的引用。
计算或存储一个(多个)flyweight的外部状态。
- #include
- #include
- using namespace std;
-
- class Flyweight {
- public:
- Flyweight(string tempIntrinsicState) {
- this->intrinsicState = tempIntrinsicState;
- }
- string GetIntrinsicState() {
- return intrinsicState;
- }
- virtual void Operation(const string& tempExtrinsicState) = 0;
- private:
- string intrinsicState;
- };
-
- class ConcreteFlyweight :public Flyweight {
- public:
- ConcreteFlyweight(string tempIntrinsicState) :Flyweight(tempIntrinsicState) {}
- void Operation(const string& tempExtrinsicState) {
- cout << this->GetIntrinsicState() << endl;
- cout << tempExtrinsicState << endl;
- }
- };
-
- class UnsharedConcreteFlyweight : public Flyweight {
- public:
- UnsharedConcreteFlyweight(string tempIntrinsicState) :Flyweight(tempIntrinsicState) {}
- void UnsharedConcreteOperation(const string& tempExtrinsicState) {
- cout << tempExtrinsicState << endl;
- }
- };
-
- class FlyweightFactory {
- public:
- Flyweight* GetFlyweight(string state) {
- vector
::iterator it = this->flyweightVector.begin(); - for (; it != this->flyweightVector.end(); it++) {
- if ((*it)->GetIntrinsicState() == state) {
- return *it;
- }
- }
- Flyweight* flyweight = new ConcreteFlyweight(state);
-
- this->flyweightVector.push_back(flyweight);
-
- return flyweight;
- }
-
- int GetFlyweightCount() {
- return this->flyweightVector.size();
- }
- private:
- vector
flyweightVector; - };
-
- int main() {
- string extrinsicState = "ExtrinsicState";
-
- FlyweightFactory* flyweightFactory = new FlyweightFactory();
-
- Flyweight* flyweight1 = flyweightFactory->GetFlyweight("AAA");
- Flyweight* flyweight2 = flyweightFactory->GetFlyweight("AAA");
- Flyweight* flyweight3 = flyweightFactory->GetFlyweight("BBB");
-
- flyweight1->Operation(extrinsicState);
-
- cout << flyweightFactory->GetFlyweightCount() << endl;
-
- cout << (flyweight1 == flyweight2) << endl;
-
- return 0;
- }