I think the pattern here is based on a set of classes. I've used this for sets of classes where the classes were related by how they access a database.
So I would have an abstract class called NWindAbstractFactory. This class would two abstract methods which would return an IProductRepository and an IOrderRepository. You couldn't implement anything directly, but your business logic was programmed against this abstract factory and interfaces.
I would then create concrete implementation of IProductRepository and IOrderRepository. Perhaps they were called SqlProductRepository and SqlOrderRepository. I could then create a concrete implementation of my abstract factory and it would be named something like NWindSqlFactory.
Maybe I would have another concrete factory called NWindXMLFactory which was able to create an XmlProductRepository and XmlOrderRepository.
I could then decide at runtime which implementation of my abstract factory I wanted to use. Maybe the NWindSqlFactory or NWindXMLFactory or maybe even NWindAccessFactory.
Again I think it works when you have a related set of classes but you don't want to program against the concrete implementation of them.
You could use a configuration setting which would use reflection to instantiate the actual implementation which you wanted. And you could do this with only one setting. You only need to specify the concrete factory--- because once you have the concrete factory, it can get all the other implementations.