14.C语言和设计模式(享元模式)
2014-06-25 09:53
337 查看
原文地址:http://blog.csdn.net/feixiaoxing/article/details/7104338
享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。
[cpp] view
plaincopy
typedef struct _Font
{
int type;
int sequence;
int gap;
int lineDistance;
void (*operate)(struct _Font* pFont);
}Font;
上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。
[cpp] view
plaincopy
typedef struct _FontFactory
{
Font** ppFont;
int number;
int size;
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance);
}FontFactory;
这里的GetFont即使对当前的Font进行判断,如果Font存在,那么返回;否则创建一个新的Font模式。
[cpp] view
plaincopy
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance)
{
int index;
Font* pFont;
Font* ppFont;
if(NULL == pFontFactory)
return NULL;
for(index = 0; index < pFontFactory->number; index++)
{
if(type != pFontFactory->ppFont[index]->type)
continue;
if(sequence != pFontFactory->ppFont[index]->sequence)
continue;
if(gap != pFontFactory->ppFont[index]->gap)
continue;
if(lineDistance != pFontFactory->ppFont[index]->lineDistance)
continue;
return pFontFactory->ppFont[index];
}
pFont = (Font*)malloc(sizeof(Font));
assert(NULL != pFont);
pFont->type = type;
pFont->sequence = sequence;
pFont->gap = gap;
pFont->lineDistance = lineDistance;
if(pFontFactory-> number < pFontFactory->size)
{
pFontFactory->ppFont[index] = pFont;
pFontFactory->number ++;
return pFont;
}
ppFont = (Font**)malloc(sizeof(Font*) * pFontFactory->size * 2);
assert(NULL != ppFont);
memmove(ppFont, pFontFacoty->ppFont, pFontFactory->size);
free(pFontFactory->ppFont);
pFontFactory->size *= 2;
pFontFactory->number ++;
ppFontFactory->ppFont = ppFont;
return pFont;
}
享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。
[cpp] view
plaincopy
typedef struct _Font
{
int type;
int sequence;
int gap;
int lineDistance;
void (*operate)(struct _Font* pFont);
}Font;
上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。
[cpp] view
plaincopy
typedef struct _FontFactory
{
Font** ppFont;
int number;
int size;
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance);
}FontFactory;
这里的GetFont即使对当前的Font进行判断,如果Font存在,那么返回;否则创建一个新的Font模式。
[cpp] view
plaincopy
Font* GetFont(struct _FontFactory* pFontFactory, int type, int sequence, int gap, int lineDistance)
{
int index;
Font* pFont;
Font* ppFont;
if(NULL == pFontFactory)
return NULL;
for(index = 0; index < pFontFactory->number; index++)
{
if(type != pFontFactory->ppFont[index]->type)
continue;
if(sequence != pFontFactory->ppFont[index]->sequence)
continue;
if(gap != pFontFactory->ppFont[index]->gap)
continue;
if(lineDistance != pFontFactory->ppFont[index]->lineDistance)
continue;
return pFontFactory->ppFont[index];
}
pFont = (Font*)malloc(sizeof(Font));
assert(NULL != pFont);
pFont->type = type;
pFont->sequence = sequence;
pFont->gap = gap;
pFont->lineDistance = lineDistance;
if(pFontFactory-> number < pFontFactory->size)
{
pFontFactory->ppFont[index] = pFont;
pFontFactory->number ++;
return pFont;
}
ppFont = (Font**)malloc(sizeof(Font*) * pFontFactory->size * 2);
assert(NULL != ppFont);
memmove(ppFont, pFontFacoty->ppFont, pFontFactory->size);
free(pFontFactory->ppFont);
pFontFactory->size *= 2;
pFontFactory->number ++;
ppFontFactory->ppFont = ppFont;
return pFont;
}
相关文章推荐
- 设计模式十四(享元模式flyweight,python语言实现)
- Java语言设计模式之享元模式(Flyweight)
- 干净搞定delphi多语言-兼论设计模式
- 设计模式c#语言描述——建造者模式、适配器模式、合成(Composite)模式
- .NET设计模式-享元模式(Flyweight Pattern)
- 设计模式学习笔记(十二)——Flyweight享元模式
- <设计模式:java语言中的应用>摘要、总结
- 设计模式(13)-享元模式(Flyweight)
- 非关语言: 设计模式[zt]
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
- .NET设计模式(13):享元模式(Flyweight Pattern)
- 设计模式c#语言描述——装饰(Decorator)模式
- 设计模式与泡mm的关系之flyweight享元模式及享元模式的再思考
- 设计模式之Flyweight享元模式
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
- 设计模式——享元模式
- 设计模式学习笔记(十二)——Flyweight享元模式
- 委托,语言级别的设计模式
- 设计模式学习(九)外观模式-享元模式-代理模式