【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
上面的Font表示了各种Font的模板形式。所以,下面的方法就是定制一个FontFactory的结构。
享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用WORD软件。使用WORD呢, 那就少不了设置模板。什么模板呢,比如说标题的模板,正文的模板等等。这些模板呢,又包括很多的内容。哪些方面呢,比如说字体、标号、字距、行距、大小等等。
- typedef struct _Font
- {
- int type;
- int sequence;
- int gap;
- int lineDistance;
- void (*operate)(struct _Font* pFont);
- }Font;
- 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;
- }