In my opinion you will have difficulties separating the Factory Method, Abstract Factory, and Builder Pattern if you "keep your nose too close to the implementation" of the pattern. They each work best as an expression of an essential idea:
Factory Method: A(n interface) method that (A) uses
polymorphism to hide the actual type of the object constructed/returned and (B) hides the construction decisions/process from the client object. The client is guaranteed that the object constructed/returned by a factory method will implement a specific interface but the client is completely unaware of the actual type/class of the returned object. The knowledge of which class of object is appropriate is encapsulated in the implementation of the factory method and in the simplest case is directly dependent on the class that implements the factory method.
(In some cases the decisions may also be based on the state of the environment (e.g. configuration) and/or any information that the client may provide during the invocation of the factory method.***)
Benefits: Ensures that the client object implements to an interface, not the class implementation(s) � it ultimately reduces coupling between the client and the created object(s).
Abstract Factory: An interface aggregating factory methods for an entire family of related/dependent/coupled objects. Again polymorphism is used to hide the concrete implementation � but this time it's not just a single class hierarchy but it's multiple hierarchies for a family of (i.e. related) classes. It's a "Factory Method Squared" � not only don't you know the exact class of the objects that are being created for you � you don't even know which class of concrete factory you are dealing with. In this case it's likely that an implementation of a factory method will only construct objects from one-and-the-same class; i.e. a particular factory method implementation for a particular concrete factory will always construct objects from the same class (of course, exposed only through the interface specified by the factory method). However you will often obtain an Abstract Factory reference to a concrete factory through a "Fowler-style Factory Method".
Benefits: Ensures that the client object (A) implements to the family of related interfaces, not their various class implementation(s) and (B) implements to the Abstract Factory, not the various concrete factories � it ultimately reduces coupling between the client and the concrete factories and reduces coupling between the client and the families of related/dependent/coupled classes.
Builder: Separate object creation from object definition for all but the simplest of objects! Divide the construction process into two distinct stages, i.e. : persistent representation =(Director)=> construction actions =(Builder)=> object representation. GOF highlights the case where you have one director and many concrete builders. Personally, I find the case where you have multiple directors more interesting � like one director that reads property files and another that reads XML files � you have multiple directors, but you can reuse (all) your Builder(s).
Benefits: Separation of creational concerns from the object's domain behavior and state (i.e. why it's an object in the first place) � separation of concerns, potentially allowing multiple persistent representations to be used as the basis for the construction of object (graphs) that are essentially similar but require slightly varying implementations.
(Any refinements and corrections to these ideas and their descriptions are welcome.)
(*** Strictly speaking GOF doesn't allow for this, mainly to force the "Replace Conditional with Polymorphism" refactoring. However Fowler uses the term "Factory Method" in "Replace Constructor with Factory Method" to refer to a method that simply "knows" which class (implementing the specified interface) needs to be instantiated - that "Factory Method" doesn't implement an interface method and it is static (i.e. it can't be an interface method).
Once you understand the nuances of those three patterns, the concise GOF descriptions become sufficient.
Factory Method � Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory method lets you defer instantiation to subclasses. Abstract Factory � Provide an interface for creating families of related or dependent objects without specifying their concrete classes. Builder � Separate the construction of a complex object from its representation so that the same construction process can create different representations.