享元模式看上去有点玄乎,但是其实也没有那么复杂。我们还是用示例说话。比如说,大家在使用电脑的使用应该少不了使用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; }
|
|
|