其他分享
首页 > 其他分享> > Flyweight(享元)

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