It seems a little bit silly to make a factory class solely for the purpose of accessing the reactor
A lot of programming tasks are "a little bit silly". The state of the art in programming is actually a lot silly in most areas, in my experience.
But if you're using a sufficiently new version of Twisted, then you can do what you want like this:
from twisted.internet.protocol import Factory
factory = Factory.forProtocol(YourProtocol, reactor)
If you're using an older version of Twisted without this API then you can do this instead:
from twisted.internet.protocol import ClientCreator
ClientCreator(reactor, YourProtocol, reactor).connectTCP(...)
But this is only for clients which isn't specifically what your question is about.
The idea of making the reactor
attribute that most transports already have part of the guaranteed transport interface (which it is not currently part of) has been discussed by the Twisted development team from time to time. If you want a better answer to this question then you could try motivating some action on that front.