Вы не хотите создать массив в фабричном методе и вернуть указатель клиенту. Таким образом, вы не представляете, сколько кнопок, так что вы действительно ничего не можете сделать с тем, что получаете.
В C ++ 11 вы можете вернуть std::vector<shared_ptr<Button>>
или даже std::vector<unique_ptr<Button>>
.
Вероятно, я бы выбрал это решение: вернуть какую-то пользовательскую коллекцию Button
"только для чтения", которая предоставляет счетчик и индексатор и ничего более. Возможно, добавьте итераторы, если это будет соответствовать вашим сценариям.
class ButtonCollection
{
public:
size_t getCount() const {}
Button& getAt(size_t index) {}
const Button& getAt(size_t index) const {}
private:
friend class GUIFactory;
ButtonCollection() {}
add(Button* button) {}
// Or in C++11:
// add(std::unique_ptr<Button> button) {}
};
С вашим скелетом приложения:
Application(GUIFactory& factory)
{
std::auto_ptr<ButtonCollection> buttons = factory.createButtons();
// Or in C++11:
//std::unique_ptr<ButtonCollection> buttons = factory.createButtons();
for(...) {...}
}