Это похоже на один из моих других вопросов, но достаточно отличается, я думаю, чтобы оправдать новый вопрос.
В основном я пишу пользовательский интерфейс, и в моем пользовательском интерфейсе есть узлы, которые можно выбрать. Когда узел выбран, пользовательский интерфейс заканчивается базовым классом абстрактного узла «INode». Из этого я получаю фабрику, выполняя node-> getFactory (), и из этого я могу создать соответствующие диалоги или представления для этого узла, потому что правильная фабрика возвращается конкретным узлом (например, factory-> createAddDialog (), factory- > 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: Это кажется небольшим ограничением, так как я не смогу поменять класс, и я не заинтересован в том, чтобы узел узнал о конкретной реализации фабрики - хотя в этом случае это может и не сделать быть слишком большой проблемой (знаменитые последние слова!).
Есть мысли по этому поводу?
Спасибо.
EDIT:
Извините, пропущены объявления переменных в исходной записи, исправлено.
EDIT:
Другая проблема, связанная с вариантом 2, заключается в том, что мне нужно реализовать getFactory в каждом типе узла. По крайней мере, с опцией 1 базовый класс может просто каждый раз возвращать абстрактный фабричный класс внедрения.