What if you could add new object types without rewriting your entire codebase?
Why Factory Method pattern in LLD? - Purpose & Use Cases
Imagine you are building a software system that needs to create different types of objects, like various shapes or documents, by hand. Every time you want a new type, you write new code everywhere to create it.
This manual approach is slow and confusing. You have to change many places in your code to add a new object type. It's easy to make mistakes and hard to keep track of all the creation logic scattered around.
The Factory Method pattern solves this by centralizing object creation. It lets you define a method that creates objects, but lets subclasses decide which object to create. This keeps your code clean, flexible, and easy to extend.
if(type == 'circle') { return new Circle(); } else if(type == 'square') { return new Square(); }
Shape shape = shapeFactory.createShape();
It enables easy addition of new object types without changing existing code, making your system scalable and maintainable.
Think of a document editor that can create different document types like Word, PDF, or Excel. Using Factory Method, adding a new document type is simple and doesn't break existing code.
Manual object creation scatters code and causes errors.
Factory Method centralizes and delegates creation to subclasses.
This pattern makes adding new types easy and safe.
Practice
Factory Method pattern in system design?Solution
Step 1: Understand the Factory Method pattern goal
The Factory Method pattern aims to separate object creation from usage by defining an interface for creating objects.Step 2: Identify the role of subclasses
Subclasses decide which specific class to instantiate, allowing flexibility and easy extension.Final Answer:
To define an interface for creating objects but let subclasses decide which class to instantiate -> Option CQuick Check:
Factory Method = Interface for object creation + subclass decides [OK]
- Confusing Factory Method with Singleton pattern
- Thinking Factory Method creates objects directly without abstraction
- Mixing Factory Method with global access patterns
Solution
Step 1: Understand Factory Method signature
The Factory Method returns an object of a product type, so it must have a return type matching the product interface or class.Step 2: Check access and static modifiers
Factory Methods are usually instance methods (not static) and public to allow subclass overriding and usage.Final Answer:
public Product createProduct(); -> Option AQuick Check:
Factory Method returns product instance, public and non-static [OK]
- Using void return type instead of product
- Making Factory Method static which breaks subclass override
- Declaring Factory Method private so subclasses can't override
abstract class Creator {
abstract Product factoryMethod();
void someOperation() {
Product product = factoryMethod();
print(product.operation());
}
}
class ConcreteProductA implements Product {
String operation() => "Product A operation";
}
class ConcreteCreatorA extends Creator {
Product factoryMethod() => ConcreteProductA();
}
void main() {
Creator creator = ConcreteCreatorA();
creator.someOperation();
}Solution
Step 1: Trace the factoryMethod call in ConcreteCreatorA
ConcreteCreatorA overrides factoryMethod to return ConcreteProductA instance.Step 2: Call operation() on ConcreteProductA instance
ConcreteProductA's operation() returns "Product A operation" which is printed.Final Answer:
Product A operation -> Option DQuick Check:
ConcreteCreatorA creates ConcreteProductA, prints its operation [OK]
- Assuming abstract Creator can be instantiated
- Forgetting ConcreteCreatorA overrides factoryMethod
- Expecting generic Product operation output
abstract class Creator {
Product factoryMethod();
}
class ConcreteCreator extends Creator {
void factoryMethod() {
print("Creating product");
}
}Solution
Step 1: Check method signature in abstract Creator
factoryMethod returns Product type, so subclass must match return type.Step 2: Check ConcreteCreator's factoryMethod signature
It returns void, which conflicts with abstract method's Product return type.Final Answer:
ConcreteCreator's factoryMethod has wrong return type -> Option AQuick Check:
Return type mismatch causes error [OK]
- Ignoring return type mismatch
- Thinking abstract class can't have abstract methods
- Assuming static needed for Factory Method
Solution
Step 1: Apply Factory Method pattern structure
Define an abstract creator class with a factoryMethod that returns a Notification interface or abstract class.Step 2: Implement concrete creators for each notification type
Each subclass (EmailCreator, SMSCreator, PushCreator) overrides factoryMethod to create its specific Notification object.Step 3: Ensure easy extension without modifying existing code
Adding new notification types means adding new creator subclasses without changing existing ones, following open-closed principle.Final Answer:
Create an abstract NotificationCreator with a factoryMethod returning Notification; implement subclasses EmailCreator, SMSCreator, PushCreator each creating respective Notification objects -> Option BQuick Check:
Factory Method enables easy extension via subclassing [OK]
- Using if-else inside one class, violating open-closed principle
- Using static methods, reducing flexibility
- Not using a common interface for notifications
Ready to prove it?
Pass the test and this pattern moves unknown
