享元模式
优质
小牛编辑
136浏览
2023-12-01
享元模式
享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。
typedef struct _Font
{
int type;
int sequence;
int gap;
int lineDistance;
void (*operate)(struct _Font* pFont);
}Font;
上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。
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模式。
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;
}