Вопрос по паттерну Фабрика
От: anidal  
Дата: 26.04.08 10:12
Оценка:
Вопрос к Гуру.
Есть проект на С, достаточно объёмный, в к-м реализован (естественно на C)
аналог паттерна фабрика.
Сейчас, в связи со значительный расширением функционала возникла идея перевести код на С++,
благо архитектура очень хорошо подходит под ООП и аналог ООП на С уже реализован.
Однако есть вопрос:
Основа системы — механизм создания/удаления экземпляров разл. классов.
Есть файл, в к-м описывается, сколько, каких, в каком порядке и с какими параметрами надо создать экземпляров классов.

//заголовочник
typedef struct _UNI_FACE{
    long Id;
    _UNI_FACE* (*Constructor) (CCModule* pCCModule);
    void (*Destructor)       (_UNI_FACE* This);
} UNI_FACE;



    unsigned long Id = pCCModule->ulModuleId;
    long i;
    long size=0;
    UNI_FACE* current = NULL;                     

    #pragma segment="CID_INIT_SEGMENT"
    UNI_FACE **pointer = (UNI_FACE**)__segment_begin("CID_INIT_SEGMENT");
    #pragma segment="CID_INIT_SEGMENT"
    size=__segment_size("CID_INIT_SEGMENT");
    size /= sizeof(UNI_FACE *); //4;                                    
    for (i = 0; i < size; i++) {                    
        if (pointer[i]->Id == Id) {
            current = pointer[i];
            break;
        }
    }
    if (!current) {                             
        return NULL;
    }
    current = (UNI_FACE *)current->Constructor(pCCModule); 
    if (!current) {                              
        return NULL;
    }
    LInsert(&configuration_head,current);

pCCModule — данные о классе и его парамерах
CID_INIT_SEGMENT — сегмент, в к-м храняться данные о имеющихся в системе типах классов.
Для каждого класса есть константная структура, указатель на к-ю и кладётся в сегмент CID_INIT_SEGMENT

UNI_FACE* ID10000_Constructor (CCModule* pCCModule);
void  ID10000_Destructor  (UNI_FACE* This);


const UNI_FACE ID10000_face={
    ID10000,
    ID10000_Constructor,
    ID10000_Destructor
};


#pragma location="CID_INIT_SEGMENT"                    
__root void* const ID10000Point=(void*)&ID10000_face;


путем добавления/исключения соотв. .с файлов можно добавлять и удалять типы классов в системе.


Теперь проблема — рассмотрел реализации такого механизма на С++. Предлагается либо в реализации фабрики заранее задавать
switch с прямыми вызовами конструкторов соотв. классов, либо иметь массив (Id,*класс), в к-м регистрировать имеющиеся классы.
Оба подхода неприемлемы, т.к. требуют при изменении состава классов менять код фабрики (или её инициализации). Существует ли иной путь?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.