ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flyweight(享元)

2020-11-08 14:02:04  阅读:215  来源: 互联网

标签:享元 状态 Chesspiece 对象 外部 Flyweight put


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有