首页 > 其他 > 详细

Flyweight(享元)

时间:2020-11-08 17:08:55      阅读:23      评论:0      收藏:0      [点我收藏+]

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 }

 

Flyweight(享元)

原文:https://www.cnblogs.com/46cxf/p/13944174.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!