Вопрос об абстрактных фабриках и инжекции

Это подобно одному из моих других вопросов, но достаточно отличается, я думаю для гарантирования нового вопроса.

В основном я пишу пользовательский интерфейс, и мой пользовательский интерфейс имеет узлы, которые могут быть выбраны. Когда узел выбран, пользовательский интерфейс заканчивается с абстрактным базовым классом узла "INode". От этого я получаю фабрику путем выполнения узла-> getFactory (), и от этого я могу создать appropiate диалоговые окна или представления для того узла, потому что корректная фабрика возвращается конкретным узлом (например, фабрика-> createAddDialog (), фабрика-> createView (узел), и т.д.).

Мой вопрос о попытке найти, что лучший способ для той фабрики входит в узел во-первых.

До сих пор я думал о 3 путях:

1) Введите корректную фабрику, когда я создам узел:

AreaNode *node = new AreaNode(new AreaNodeFactory());

Таким образом, определение AreaNode:

AreaNode : public INode
{
    AreaNode(INodeAbstractFactory *injectedFactory)
    {
        m_injectedFactory = injectedFactory;
    }

    INodeAbstractFactory* getFactory()
    {
        return m_injectedFactory;
    }

    INodeAbstractFactory* m_injectedFactory;
};

2) Введите более общую фабрику и позвольте узлу получать фабрику от той фабрики:

AreaNode : public INode
{
    AreaNode(IFactory *injectedFactory)
    {
        m_injectedFactory = injectedFactory;
    }

    INodeAbstractFactory* getFactory()
    {
        return m_injectedFactory->getAreaNodeFactory();
    }

    IFactory* m_injectedFactory;
}

3) Просто создайте конкретную фабрику (хотя это удаляет объем для использования различных фабрик для того же узла, возможно, для тестирования или для более поздних изменений):

AreaNode : public INode
{
    INodeAbstractFactory* getFactory()
    {
        return new AreaNodeFactory();
    }
}

Текущие мысли об этих опциях:

Опция 1: Могло быть немного случайным - я должен буду удостовериться, что всегда даю ему корректную фабрику для того типа, или возможно я мог просто использовать другую фабрику для введения корректной фабрики для меня.

Опция 2: Вынуждает узел знать об абстрактной реализации фабрики достаточно, чтобы смочь назвать getAreaNodeFactory, который не может быть такой плохой вещью. Это, по крайней мере, помогает гарантировать, что корректная/та же фабрика будет всегда выбираться (предположение, что более общая фабрика реализована правильно).

Опция 3: Это чувствует себя мало строгим, поскольку я не смогу выгрузить класс, и я не увлечен узлом, имеющим необходимость знать о конкретной реализации фабрики - хотя в этом случае это не могло бы быть слишком много проблемы (известные последние слова!).

Какие-либо мысли об этом?

Спасибо.

Править: Извините пропущенный объявления переменной в сообщении источника, исправленном.

Править: Другая проблема с опцией 2, я должен реализовать "getFactory" в каждом типе узла. По крайней мере, с опцией 1 базовый класс может просто возвратиться, вводить абстрактная фабрика классифицируют каждый раз..

6
задан Mark 3 August 2010 в 14:08
поделиться