Вы здесь путаете понятия?
Шаблон Factory обычно применяется, когда вы возвращаете экземпляр конкретного класса, который скрывается за абстрактным интерфейсом. Идея состоит в том, что вызывающая сторона увидит только интерфейс и даже не должна знать, какой конкретно тип объекта. Это все о создании экземпляра объекта на основе параметров и отделении логики, связанной с решением, какой объект создать от пользователя, создающего объект.
То, что вы описываете, представляет собой смесь Singleton (или MonoState) и Factory. Ваша фабрика имеет состояние, поэтому она не может быть статичной. В этом случае вам нужно будет применить что-то вроде шаблона Singleton для управления созданием одного экземпляра Factory с соответствующими глобальными переменными, скрытыми в нем:
class IMonkeyFish {
public:
virtual ~IMonkeyFish() = 0;
virtual void go() = 0;
};
class Factory {
public:
static Factory& instance();
IMonkeyFish* createMonkeyFish();
protected:
Factory(GlobalObjectA& a, GlobalObjectB& b, GlobalObjectC& c);
private:
static Factory *theInstance;
GlobalObjectA& instanceOfA;
GlobalObjectB& instanceOfB;
GlobalObjectC& instanceOfC;
};
Factory& factory = Factory::instance();
IMonkeyFish* fishie = factory.createMonkeyFish();
fishie->go();
Шаблон Singleton
управляет созданием фабричного экземпляра. Шаблон Factory
скрывает детали, связанные с созданием объектов, которые реализуют интерфейс IMonkeyFish
. Хорошая вещь (TM) - это сокрытие глобального состояния и отделение MonkeyFish
конкретных деталей от создания экземпляра.
Использование или правильность использования Singleton
- это совсем другая проблема. Вероятно, вокруг этого тоже есть куча потоков.