It may seem as if this is question is a dupe, but please bear with me - I promise I've read the related posts (and the GOF book).
After everything I've read, I still don't have it clear when to use an Abstract Factory, a Factory Method, or a Builder. I believe it will finally sink in after I see a simple example of a problem which is best approached by, say, a builder and it would be clearly silly to use, say, an abstract factory.
Can you provide a simple example where you would clearly use one pattern and not the others?
I understand it may boil down to a matter of opinion if the example is too simple, but I'm hopeful that if anybody can, that person is in SO.
Thanks.
The Abstract Factory pattern uses subclassing (of factories) to produce other objects (non-factories). Abstract Factory also envisions that the objects produced belong to parallel hierarchies (e.g. to handle platform independance, one hierarchy for each platform).
The Builder pattern uses subclassing to produce "output" - which is not necessarily objects at all. The GOF example has the Builder producing text output (markup or otherwise).
The Factory Method pattern, unlike the other two, divides the "creator" into an abstract and concrete implementation (thus the emphasis on it belonging to a framework implementation). Like Abstract Factory, it deals with making actual objects.
All three are highly similar, because they all use subclassing. It is the subclassing that is the outstanding quality of them all, which hides the subtle differences (outlined above) and thus many people have difficulty seeing the differences.
Please visit the following url for more details.
http://xeon2k.wordpress.com
Builder
Factory method
Abstract Factory
A builder helps you construct a complex object. An example is the
StringBuilder
class (Java, C#), which builds the final string piece by piece. A better example is the UriComponentsBuilder in Spring, which helps you build a URI.A factory method gives you a complete object in one shot (as opposed to the builder). A base class defines a single abstract method that returns an interface (or super class) reference, and defers the concrete creation of the object to subclasses.
An abstract factory is an interface (or abstract class) to create many different related objects. A good example (in .NET) is the
DbProviderFactory
class, that serves to create related objects (connections, commands, ...) to a given database provider (oracle, sql server, ...), depending on its concrete implementation.Abstract Factory, Factory Method, Builder : All these patterns are creational patterns,which are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation.
Factory method:
It may use inheritance or sub classing to achieve the purpose
Key note: You will create an interface & specific implementation of these interfaces. In Factory method, depending on condition, you will get concrete implementation of common interface.
Abstract Factory:
Builder:
Guidelines for Builder design pattern in Java
Related posts:
Design Patterns: Factory vs Factory method vs Abstract Factory
Keeping builder in separate class (fluent interface)
Useful links:
sourcemaking design-patterns
Abstract Factory is particularly helpful for test driven development and reducing coupling.
For example, in C#:
This way, you can use dependency injection to inject the default implementations for production code, and then you can easily mock the factory and the objects it creates.