- How are these three patterns different from each other?
Factory: Creates objects without exposing the instantiation logic to the client.
Factory Method: Define an interface for creating an object, but let the subclasses decide which class to instantiate. The Factory method lets a class defer instantiation to subclasses
Abstract Factory: Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
AbstractFactory pattern uses composition to delegate responsibility of creating object to another class while Factory method design pattern uses inheritance and relies on derived class or sub class to create object
- When to use which?
Factory: Client just need a class and does not care about which concrete implementation it is getting.
Factory Method: Client doesn't know what concrete classes it will be required to create at runtime, but just wants to get a class that will do the job.
AbstactFactory: When your system has to create multiple families of products or you want to provide a library of products without exposing the implementation details.
Abstract Factory classes are often implemented with Factory Method. Factory Methods are usually called within Template Methods.
- And also if possible, any java examples related to these patterns?
Factory and FactoryMethod
Intent:
Define an interface for creating an object, but let sub classes decide which class to instantiate. Factory Method lets a class defer instantiation to sub classes.
UML diagram:
Product: It defines an interface of the objects the Factory method creates.
ConcreteProduct: Implements Product interface
Creator: Declares the Factory method
ConcreateCreator: Implements the Factory method to return an instance of a ConcreteProduct
Problem statement: Create a Factory of Games by using Factory Methods, which defines the game interface.
Code snippet:
Factory Pattern. When to use factory methods?
Comparison with other creational patterns:
Design start out using Factory Method (less complicated, more customizable, subclasses proliferate) and evolve toward Abstract Factory, Prototype, or Builder (more flexible, more complex) as the designer discovers where more flexibility is needed
Abstract Factory classes are often implemented with Factory Methods, but they can also be implemented using Prototype
References for further reading: Sourcemaking design-patterns