享元(FlyWeight)模式
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
代码:
#include <iostream>
#include <string>
#include <ctime>
#include <map>
using namespace std; class Shape
{
public:
virtual void draw() = ;
virtual ~Shape(){}
}; class Circle : public Shape
{
public:
Circle(string color, int x=, int y=, int radius=) :_color(color), _x(x), _y(y), _radius(radius){} void setX(int x)
{
_x = x;
} void setY(int y)
{
_y = y;
} void setRadius(int radius)
{
_radius = radius;
} void set(int x, int y)
{
_x = x;
_y = y;
} virtual void draw()
{
cout << "Draw circle [color:" << _color << ", at(" << _x<< ","<< _y << "), radius("<< _radius << ")]" << endl;
} private:
int _x;
int _y;
int _radius;
string _color; //内部状态
}; class CircleFactory
{
public:
CircleFactory()
{
_map.clear();
} Circle *getCircle(string color)
{
if (_map.find(color) == _map.end())
{
int x, y;
x = getRandomXY();
y = getRandomXY();
Circle *c = new Circle(color, x, y);
c->setRadius();
_map[color] = c;
return c;
}
return _map[color];
} ~CircleFactory()
{
for (auto it = _map.begin(); it != _map.end(); ++it)
{
delete it->second;
}
} int getRandomXY()
{
return rand() % ;
} int getCricleCount()
{
return _map.size();
} string getRandomColor()
{
static string colors[] = { "red", "Green", "blue", "white", "black", "purple", "yellow", "orange"};
static int len = sizeof(colors) / sizeof(*colors);
int index = rand() % len;
return colors[index];
} private:
map<string, Circle*> _map;
}; void test()
{
srand(time(NULL));
CircleFactory cf;
Circle *c = NULL; for (int i = ; i < ; ++i)
{
string color = cf.getRandomColor();
c = cf.getCircle(color);
c->draw(); }
} int main()
{
test();
cin.get();
return ;
}
效果:

享元(FlyWeight)模式的更多相关文章
- Java 实现享元(Flyweight)模式
/** * 字母 * @author stone * */ public class Letter { private String name; public Letter(String name) ...
- 十二、享元(Flyweight)模式--结构模式(Structural Pattern)
Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...
- 设计模式C++描述----12.享元(Flyweight)模式
一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...
- python 设计模式之享元(Flyweight)模式
#写在前面 这个设计模式理解起来很容易.百度百科上说的有点绕口. #享元模式的定义 运用共享技术来有効地支持大量细粒度对象的复用. 它通过共享已经存在的对橡大幅度减少需要创建的对象数量.避免大量相似类 ...
- 十一、结构模式之享元(Flyweight)模式
什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...
- Java设计模式:Flyweight(享元)模式
概念定义 享元(Flyweight)模式运用共享技术高效地支持大量细粒度对象的复用. 当系统中存在大量相似或相同的对象时,有可能会造成内存溢出等问题.享元模式尝试重用现有的同类对象,如果未找到匹配的对 ...
- 设计模式(11)--Flyweight(享元模式)--结构型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 2.模式特点: 享元模 ...
- Flyweight 享元模式 MD
享元模式 简介 在JAVA语言中,String类型就是使用了享元模式,JAVA中的字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝,避免了在创建N多相同对象时所产生的不 ...
- 享元(Flyweight)模式
享元(Flyweight)模式:运用共享技术有效的支持大量细粒度的对象. /* * 抽象享元(Flyweight)角色:此角色是所有的具体享元类的超类,为这些类规定出需要实现的公共接口. 那些需要外蕴 ...
随机推荐
- Estimating Linguistic Complexity for Science Texts--paper
http://aclweb.org/anthology/W18-0505 https://sites.google.com/site/nadeemf0755/research/linguistic-c ...
- 【二分图最大权完美匹配】【KM算法】【转】
[文章详解出处]https://www.cnblogs.com/wenruo/p/5264235.html KM算法是用来求二分图最大权完美匹配的.[也就算之前的匈牙利算法求二分最大匹配的变种??] ...
- hdu3642 Get The Treasury 线段树--扫描线
Jack knows that there is a great underground treasury in a secret region. And he has a special devic ...
- WCF中的Dispose(转)
毫无疑问,在.NET Framework中,一个资源(尤其是非托管资源)通常都需要实现IDisposable接口.一旦实现了该接口,我们就可以使用using语句来管理资源,这是最便捷的方式.但是,一旦 ...
- torchvision库简介(翻译)
部分跟新于:4.24日 torchvision 0.2.2.post3 torchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详细介绍在:http ...
- Python-pycurl模块的安装
先执行以下命令(因为我在另一个终端执行,所以history的编号有重复) 7 wget https://pypi.python.org/packages/source/p/pycurl/pycurl- ...
- MySQL Binlog--MIXED模式下数据更新
在 Mixed 模式下,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种.如果SQL语句为UPDATE/DELETE等 ...
- C# to IL 7 Pointers(指针)
Pointers are the heart and soul of a programming language. The only reason why the Cprogramming lang ...
- 存储-实例-ibm v3700
raid5总容量计算(n-1)*最小盘容量 RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAI ...
- day 27 网络通信协议 tup udp 下的socket
1.osi七层模型 通信流程 socket(抽象层): 结合上图来看,socket在哪一层呢,我们继续看下图 socket在内的五层通讯流程: 2.TCP/UDP的区别: TCP是以数据流的形式传输, ...