Usually, "Thing" is an interface or abstract class. There can be many different implementations or subclasses. Using the Factory patterns lets you get an instance of whatever implementation is appropriate. The Factory Method might choose among multiple implementations based on (for example) an external configuration file, or based on parameters you pass to the Factory Method itself. One good example is the java.sql.DriverManager.getConnection() method, which give you a JDBC "Connection" object. Connection is an interface. Every JDBC driver supplies its own implementation. getConnection() chooses between drivers based on the connection string you pass as an argument, and returns that driver's implementation of Connection. You don't need to know anything about the class names that make up the driver, and using a different driver is just a matter of changing a String, which very often is something you load out of a runtime configuration file.