• Flyweight Pattern


    1.Flyweight 模式以共享的方式高效的支持大量的细粒度对象,对象分为内部状态、外部状态。将可以被共享的状态作为内部状态存储在对象中,而外部状态在适当的时候作为参数传递给对象。

    当以下所有的条件都满足时,可以考虑使用享元模式:

    • 一个系统有大量的对象。
    • 这些对象耗费大量的内存。
    • 这些对象的状态中的大部分都可以外部化。
    • 这些对象可以按照内蕴状态分成很多的组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。
    • 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

    2.Flyweight模式结构图(不想被共享的对象UnshaerConcreteFlyweight,暂不讨论)

    3.实现

     1 #ifndef _FLYWEIGHT_H_ 
     2 #define _FLYWEIGHT_H_
     3 
     4 #include <string> 
     5 using namespace std;
     6 
     7 class Flyweight 
     8 { 
     9 public:
    10     virtual ~Flyweight();
    11     virtual void Operation(const string& extrinsicState);
    12     string GetIntrinsicState();
    13 protected: 
    14     Flyweight(string intrinsicState);
    15 private: 
    16     string _intrinsicState;
    17 };
    18 
    19 class ConcreteFlyweight:public Flyweight 
    20 { 
    21 public: 
    22     ConcreteFlyweight(string intrinsicState);
    23     ~ConcreteFlyweight();
    24     void Operation(const string& extrinsicState);
    25 protected:
    26 private: 
    27 }; 
    28 
    29 #endif
    Flyweight.h
     1 #include "Flyweight.h" 
     2 #include <iostream> 
     3 using namespace std;
     4 
     5 Flyweight::Flyweight(string intrinsicState) 
     6 { 
     7     this->_intrinsicState = intrinsicState;
     8 }
     9 Flyweight::~Flyweight() 
    10 {
    11 
    12 }
    13 void Flyweight::Operation(const string& extrinsicState) 
    14 {
    15 
    16 }
    17 string Flyweight::GetIntrinsicState() 
    18 { 
    19     return this->_intrinsicState; 
    20 }
    21 ConcreteFlyweight::ConcreteFlyweight(string intrinsicState):Flyweight(intrinsicState) 
    22 { 
    23     cout<<"ConcreteFlyweight Build....."<<intrinsicState<<endl;
    24 }
    25 ConcreteFlyweight::~ConcreteFlyweight() 
    26 {
    27 
    28 }
    29 void ConcreteFlyweight::Operation(const string& extrinsicState) 
    30 { 
    31     cout<<"ConcreteFlyweight:内蕴["<<this->GetIntrinsicState()<<"] 外蕴["<<extrinsicState<<"]"<<endl; 
    32 }
    Flyweight.cpp
     1 #ifndef _FLYWEIGHTFACTORY_H_
     2 #define _FLYWEIGHTFACTORY_H_
     3 
     4 #include "Flyweight.h" 
     5 #include <string> 
     6 #include <vector> 
     7 using namespace std;
     8 
     9 class FlyweightFactory 
    10 { 
    11 public: 
    12     FlyweightFactory();
    13     ~FlyweightFactory();
    14     Flyweight* GetFlyweight(const string& key);
    15 protected:
    16 private: 
    17     vector<Flyweight*> _fly;
    18 }; 
    19 
    20 #endif
    FlyweightFactory.h
     1 #include "FlyweightFactory.h" 
     2 #include <iostream> 
     3 #include <string> 
     4 #include <cassert> 
     5 using namespace std;
     6 using namespace std;
     7 
     8 FlyweightFactory::FlyweightFactory()
     9 {
    10 
    11 }
    12 FlyweightFactory::~FlyweightFactory() 
    13 {
    14 
    15 }
    16 Flyweight* FlyweightFactory::GetFlyweight(const string& key)
    17 { 
    18     vector<Flyweight*>::iterator it = _fly.begin();
    19     for (; it != _fly.end();it++) 
    20     { //找到了,就一起用,^_^ 
    21         if ((*it)->GetIntrinsicState() == key) 
    22         { 
    23             cout<<"already created by users...."<<endl;
    24             return *it; 
    25         } 
    26     }
    27     Flyweight* fn = new ConcreteFlyweight(key);
    28     _fly.push_back(fn);
    29     return fn; 
    30 }
    FlyweightFactory.cpp
     1 #include "Flyweight.h" 
     2 #include "FlyweightFactory.h" 
     3 #include <iostream> 
     4 using namespace std;
     5 
     6 int main(int argc,char* argv[]) 
     7 { 
     8     FlyweightFactory* fc = new FlyweightFactory();
     9     Flyweight* fw1 = fc->GetFlyweight("hello"); 
    10     Flyweight* fw2 = fc->GetFlyweight("world!");
    11     Flyweight* fw3 = fc->GetFlyweight("hello");
    12     return 0; 
    13 }
    main.cpp
  • 相关阅读:
    Lintcode423-Valid Parentheses-Easy
    Lintcode97-Maximum Depth of Binary Tree-Easy
    Lintcode175-Revert Binary Tree-Easy
    Lintcode469-Same Tree-Easy
    Leetcode480-Binary Tree Paths-Easy
    Lintcode481-Binary Tree Leaf Sum-Easy
    Lintcode482-Binary Tree Level Sum-Easy
    Lintcode376-Binary Tree Path Sum-Easy
    SQL
    Database
  • 原文地址:https://www.cnblogs.com/programmer-wfq/p/4662131.html
Copyright © 2020-2023  润新知