Questo non ha nulla a che fare con il pattern Singleton.
Ciò di cui hai bisogno è una specie di tipo di gestore delle risorse che registra gli oggetti delle fabbriche, uno per ciascun tipo di risorsa che desideri sia in grado di fornire. Ogni oggetto factory saprebbe come caricare il tipo di risorsa associato.
Quindi, quando si desidera una risorsa, si utilizza una funzione per ottenere la risorsa da un'istanza del gestore risorse, che troverà la risorsa già caricata per voi o richiederà il factory specifico del tipo di risorsa che possiede per caricarlo.
L'interfaccia sarebbe simile a questa (ma in realtà dipende dal tuo contesto alla fine):
class ResourceManager
{
public:
template<ResourceType>
void add_factory( std::shared_ptr<ResourceFactory<ResourceType>> factory );
template<Resourcetype>
std::shared_ptr<ResourceType> get(); // will look into registered factories and provide a resource instance if it
};
Questo è un modo classico per gestire le risorse raccolte in un oggetto.
Una volta che si ha un tipo di questo tipo (una classe ResourceManager per esempio) funzionante, è facile farlo (o no, come altri suggeriscono) Singleton. Non lo consiglio però.
Non è la tua classe che è polimorfica, è il tipo di risorsa.
Un modo migliore, il più delle volte, è di passare un riferimento all'istanza del gestore risorse in funzioni e tipi che ne hanno bisogno. Ci sono casi in cui renderlo un singleton sarebbe meglio, ma è molto raro.