Videos
Is the Singleton pattern suitable for all scenarios?
Can I use Enum for implementing Singleton?
How does serialization affect Singleton?
Factsheet
It's not great...
My question is, is this pattern a good move? Also, is the class term "PrinterFactory" even applicable since it only constructs one instance in its entire existence within the process lifetime?
The problem I see with this implementation is that there are two cooks in charge of making the same broth.
A factory's job is to provide a public point to generate Foo from. You use it when consumers cannot feasibly create their own Foo "in the field" (as it were), and the factory provides that ability for them.
A singleton is designed to reduce instantiation to a single instance; but it almost inherently also comes with a way to access this single instance. In effect, it also acts as a public point to "generate" Foo from. By that I mean that consumer's don't actively care whether they're getting a newly created Foo or a reused pre-existing Foo.
There is no need to develop this responsibility twice. The two cooks are battling over the same broth.
... but it's not impossible either.
That being said, it is possible that this is a meeting of what was once two separate features.
For example, let's say this is about data access. You used to use a library that required generating new connection objects, and therefore you wrote a factory that generated these objects. Your entire codebase now uses that factory.
Today, you are changing your DB provider, and the new provider requires you to reuse the same connection object (for the purposes of this example, it is done via a singleton).
You don't want to rewrite your entire codebase to no longer use the factory and use the singleton instead, so you come up with a different solution: the factory simply returns the singletone. This way, you don't need to change your old code, and this all works.
Conclusion
The conclusion here is that having a factory return a singleton is somewhat superfluous and is better avoided when you're building something from scratch, simply as a matter of not doing the same thing twice or muddying the line between the responsibilities.
However, if you're trying to not have to rewrite legacy code, it can make sense to end up making a factory return a singleton just to avoid having to remove prior dependencies to the factory.
I would try to avoid it if you can, but I wouldn't go as far as to say that it should never exist either.
Having a Singleton for a printer is dubious. You state that only one printer can be connected at a time, but that is a very dubious assumption. It's wrong on every single computer that I own. Plus it's wrong once you accept things like a PDF or Postscript file generator, that is used identical to a printer.
It's double dubious when the application can be launched and someone tries to print while the printer is unplugged or turned off. Singletons are supposed to live from the moment they are first requested to the moment the application dies. If a printer can be turned off and on, how do you handle this? If a printer can be unplugged and another plugged in, how do you handle this.
It's triple dubious to make even the individual printer subclasses Singletons. If I can plug in two different printers, what would keep me from plugging in two identical printers?
Rule #1 when not to use Singletons: If you need more than one.