Это подобно одному из моих других вопросов, но достаточно отличается, я думаю для гарантирования нового вопроса.
В основном я пишу пользовательский интерфейс, и мой пользовательский интерфейс имеет узлы, которые могут быть выбраны. Когда узел выбран, пользовательский интерфейс заканчивается с абстрактным базовым классом узла "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 базовый класс может просто возвратиться, вводить абстрактная фабрика классифицируют каждый раз..