gpt4 book ai didi

C++设计模式之享元模式(Flyweight)

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C++设计模式之享元模式(Flyweight)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

享元模式顾名思义就是羽量级模式或者蝇级模式,形容体量小的应用,该模式主要的设计目的是为了迎合系统大量相似数据的应用而生,减少用于创建和操作相似的细碎对象所花费的成本。大量的对象会消耗高内存,享元模式给出了一个解决方案,即通过共享对象来减少内存负载.

作用 。

通过复用相同的对象来减少对象的创建数量,创建更小的对象组,并通过共享实现重用。通过归类,将对象的属性分为内蕴状态和外蕴状态。要创建具体的享元对象,我们需要创建一个享元工厂来统一管理对象的生成和输出,享元工厂是实现享元模式的关键.

举个例子,享元模式可以看成是一个工具箱,而享元对象就是工具箱内的具体的工具,我们在使用工具的时候,不必每回临时的制造工具,而是直接从工具箱里找到工具进行使用,这样就大大节约了制造工具的成本时间和工具占用的空间.

享元模式比较迷惑在于理解两种状态的分类,内蕴状态是对象本身的属性,在生成对象以后一般不会进行改变,比如工具中的属性:名字、大小、重量等,还有就是我们一般需要一个关键性的属性作为其区别于其他对象的key,如工具的话我们可以把名称作为找到工具的唯一标识.

外蕴状态是对象的外部描述,是每个对象的可变部分,比如对工具的使用地点、使用时间、使用人、工作内容的描述,这些属性不属于对象本身,而是根据每回使用情况进行变化的,这就需要制作成接口进行外部调用,而外蕴状态的维护是由调用者维护的,对象内不进行维护.

类视图 。

C++设计模式之享元模式(Flyweight)

实现 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//Flyweight
class tool
{
public :
   //内蕴状态
   string name;
   int nSize;
   int nWeight;
public :
   //外蕴状态
   virtual int used(string person, string work)=0;
}
//ConcreteFlyweight
class hammer : public tool
{
public :
   hammer():name( "hammer" ){}
   int used(string person, string work)
   {
     cout<< person << "use" <<name<< "to" << work;
   }
 
}
//ConcreteFlyweight
class screwdriver : public tool
{
   screwdriver():name( "screwdriver" ){}
   int used(string person, string work)
   {
     cout<< person << "use" << name << " to" << work;
   }
}
//ConcreteFlyweight
class saw : public tool
{
   saw():name( "saw" ){}
   int used(string person, string work)
   {
     cout<< person << "use" << name << "to" << work;
   }
}
 
//FlyweightFactory
class toolbox
{
public :
   toolbox();
   virtual ~toolbox()
   {
     map<string,tool*>::iterator it = m_tool.find(toolname);
     for (it=m_tool.begin();it!=m_tool.end();it++)
     {
       delete it.second;
     }
 
   }
   tool* GetTool(string toolname)
   {
     map<string,tool*>::iterator it = m_tool.find(toolname);
     if (it != m_tool.end())
     {
       return (tool*) it.second;
     }
     else
     {
       tool* tooltemp= NULL;
       if (toolname == "hammer" )
         tooltemp = new hammer();
       else if (toolname == "screwdriver" )
         tooltemp = new screwdriver();
       else if (toolname == "saw" )
         tooltemp = new saw();
 
       if (tooltemp !=NULL)
         m_tool.insert(make_pair<string,tool*>(toolname,tooltemp));
       return tooltemp;
     }
   }
private :
   map<string,tool*> m_tool;
}
 
int main()
{
   //外蕴状态 由调用者维护
   string person1 = "zhangsan" ;
   string person2 = "lisi" ;
   string work1 = "make desk" ;
   string work2 = "repair bike" ;
   //生成工厂
   toolbox tBox;
   //获取享元
   tool* tool1 = tBox.GetTool( "hammer" );
   tool1.used(person1,work1);
 
   tool* tool2 = tBox.GetTool( "screwdriver" );
   tool2.used(person2,work2);
}

单享元(share)和复合享元(unshare) 复合享元也既是unshareFlyweight,其不再是单一的对象,而是一系列对象的组合,他们的关系由原来的一对一的关系,变成了一对多的关系。 举例说明,如【DP】中比较经典的围棋的例子,单享元模式下,我们对围棋的颜色种类进行共享,再棋盘的工厂类中只需包含黑白两颗棋子,就能完成对棋盘下棋的整个操作,而不用对每一个棋子进行操作。但是有一天需求增加了对胜负的要求,那么就需要对棋子的坐标进行记录,对于黑白两种颜色的棋子,相对应的就会有相同颜色棋子的坐标数组容器,like:map<string,vector<Point>> 这样的结构.

应用场景 。

  • 需要创建大量对象时;
  • 大多数对象可以分为内蕴和外蕴状态;
  • 应用程序需要使用多种对象,并且重复使用;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://www.cnblogs.com/chencarl/p/8719776.html 。

最后此篇关于C++设计模式之享元模式(Flyweight)的文章就讲到这里了,如果你想了解更多关于C++设计模式之享元模式(Flyweight)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com