Flyweight(享元)
作者:互联网
11.1定义
使用共享对象可有效地支持大量的细粒度的对象。享元模式是以共享的方式高效地支持大量的细粒度对象。享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。
■ 内部状态是存储在享元对象内部的、可以共享的信息,并且不会随环境改变而改变。
■ 外部状态是随环境改变而改变且不可以共享的状态。享元对象的外部状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。
11.2. 享元模式的优缺点
享元模式的优点在于大幅减少内存中对象的数量,降低程序内存的占用,提高性能。
但是,相应付出的代价也很高。
■ 享元模式增加了系统的复杂性,需要分出外部状态和内部状态,而且内部状态具有固化特性,不应该随外部状态改变而改变,这使得程序的逻辑复杂化。
■ 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间变长。
11.3. 享元模式的使用场景。
■ 系统中有大量的相似对象,这些对象耗费大量的内存。
■ 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,即对象没有特定身份。
■ 需要缓冲池的场景。
1 #include<iostream> 2 using namespace std; 3 4 //棋子接口Chesspiece是抽象享元,该接口中规范一个落子put()方法,对棋子的坐标进行定位通过参数的形式将外部状态传入 5 class Chesspiece{ 6 public: 7 virtual void put(int x,int y)=0; 8 }; 9 10 //棋子具体享元ChesspieceFlyweight实现棋子接口Chesspiece 11 class ChesspieceFlyweight:public Chesspiece{ 12 public: 13 ChesspieceFlyweight(string color){ 14 this->color = color; 15 } 16 void put(int x,int y){ 17 cout<<color<<"子在("<<x<<","<<y<<")落子"<<endl; 18 } 19 private: 20 string color; 21 }; 22 //棋子工厂ChesspieceFactory是享元工厂,负责创建和管理棋子 23 class ChesspieceFactory{ 24 public: 25 static Chesspiece* WHITE; 26 static Chesspiece* BLACK; 27 public: 28 static Chesspiece* getChessPiece(string color){ 29 if(color == "白"){ 30 return WHITE; 31 } 32 else if(color == "黑"){ 33 return BLACK; 34 } 35 return NULL; 36 } 37 38 }; 39 Chesspiece* ChesspieceFactory::BLACK = new ChesspieceFlyweight("黑"); 40 Chesspiece* ChesspieceFactory::WHITE = new ChesspieceFlyweight("白"); 41 int main(){ 42 ChesspieceFactory chesspieceFactory; 43 Chesspiece* p1 = chesspieceFactory.getChessPiece("黑"); 44 p1->put(1,1); 45 Chesspiece* p2 = chesspieceFactory.getChessPiece("白"); 46 p2->put(1,1); 47 delete p1; 48 p1 = NULL; 49 delete p2; 50 p2 = NULL; 51 }
标签:享元,状态,Chesspiece,对象,外部,Flyweight,put 来源: https://www.cnblogs.com/46cxf/p/13944174.html