| Scale | Object Creation Needs | Pattern Usage | Impact on System |
|---|---|---|---|
| 100 users | Few objects, simple creation | Simple Factory or direct instantiation | Minimal overhead, easy to maintain |
| 10K users | More objects, need for flexibility | Factory Method or Builder for complex objects | Improved code reuse, easier object management |
| 1M users | High object creation, performance critical | Singleton for shared resources, Prototype for cloning | Reduces resource usage, faster object creation |
| 100M users | Massive scale, distributed systems | Abstract Factory with dependency injection, Singleton with distributed locks | Ensures consistency, scalable object management |
When to use which creational pattern in LLD - Scalability & System Analysis
At small scale, object creation overhead is negligible. As users grow, the bottleneck becomes inefficient object creation causing CPU and memory strain. For example, creating many complex objects repeatedly slows down the system. Without proper patterns, code becomes hard to maintain and extend.
- Simple Factory: Use for small scale to centralize object creation.
- Factory Method: Use when subclasses decide object types, improving flexibility.
- Builder: Use for complex objects with many parts, improving readability and maintainability.
- Singleton: Use for shared resources to avoid multiple instances and save memory.
- Prototype: Use to clone objects efficiently instead of creating from scratch.
- Abstract Factory: Use in large systems to create families of related objects, supporting scalability and consistency.
- Combine with Dependency Injection: To manage object lifecycles and dependencies cleanly at scale.
- At 10K users, creating 10 objects per user per second = 100K objects/sec.
- Without patterns, each creation costs CPU cycles and memory allocation.
- Using Prototype can reduce creation time by cloning, saving CPU.
- Singleton reduces memory by sharing instances.
- At 1M users, object creation can reach millions per second, stressing CPU and memory.
- Proper patterns reduce overhead and improve throughput.
Start by explaining the problem of object creation at scale. Describe each creational pattern briefly and when it fits best. Use examples like shared resources (Singleton), complex object building (Builder), or flexible object families (Abstract Factory). Discuss bottlenecks and how patterns solve them. Show understanding of trade-offs and scalability.
Your system creates 1000 objects per second. Traffic grows 10x to 10,000 objects per second. What do you do first?
Answer: Identify if object creation is a bottleneck. If yes, apply Prototype to clone objects or Singleton to share instances where possible. Consider Builder for complex objects to optimize creation steps. This reduces CPU and memory usage, improving scalability.
Practice
Solution
Step 1: Understand the requirement for a single instance
The question asks for a pattern that ensures only one instance of a class exists.Step 2: Match the pattern to the requirement
Singleton pattern restricts instantiation to one object and provides a global access point.Final Answer:
Singleton pattern -> Option AQuick Check:
Single instance = Singleton [OK]
- Confusing Factory with Singleton
- Using Builder for single instance
- Thinking Prototype creates single instance
Solution
Step 1: Identify the pattern for flexible object creation
The question wants a pattern that creates objects without exposing the creation logic.Step 2: Match the pattern to the description
Factory pattern provides an interface to create objects but lets subclasses decide which class to instantiate.Final Answer:
Factory pattern -> Option BQuick Check:
Flexible object creation = Factory [OK]
- Choosing Singleton for flexible creation
- Confusing Builder with Factory
- Selecting Adapter which is not creational
class CarBuilder {
constructor() {
this.car = new Car();
}
setColor(color) {
this.car.color = color;
return this;
}
setWheels(wheels) {
this.car.wheels = wheels;
return this;
}
build() {
return this.car;
}
}
const car = new CarBuilder().setColor('red').setWheels(4).build();
console.log(car.color, car.wheels);What will be the output?
Solution
Step 1: Check if Car class is defined
The code usesnew Car()but Car class is not defined anywhere, causing a runtime error.Step 2: Understand the consequence of missing class
Since Car is undefined, the code throws a ReferenceError before any properties are set.Final Answer:
Error: Car is not defined -> Option DQuick Check:
Missing class definition = ReferenceError [OK]
- Assuming output is 'red 4' without Car class
- Ignoring missing class error
- Confusing Builder pattern with Factory output
class Logger {
constructor() {
if (Logger.instance) {
return Logger.instance;
}
this.logs = [];
Logger.instance = this;
}
log(message) {
this.logs.push(message);
}
}What is the main issue with this implementation?
Solution
Step 1: Analyze Singleton enforcement
The constructor returns existing instance if present, but the implementation does not fully prevent multiple instances.Step 2: Identify the issue in JavaScript context
In JavaScript, this pattern works but can be bypassed by other means; better to use static method to get instance.Final Answer:
It does not prevent multiple instances -> Option CQuick Check:
Singleton enforcement flaw = It does not prevent multiple instances [OK]
- Thinking logs are not stored
- Assuming new instance is always created
- Ignoring missing retrieval method
Solution
Step 1: Understand the complexity of the object
Meal orders have many optional parts and require step-by-step construction.Step 2: Match pattern to complex object creation
Builder pattern is designed to build complex objects step-by-step, allowing optional parts to be added flexibly.Final Answer:
Builder pattern, because it simplifies creating complex objects step-by-step -> Option AQuick Check:
Complex object with options = Builder [OK]
- Choosing Singleton for multiple orders
- Confusing Factory with Builder for complex objects
- Using Prototype without cloning need
Ready to prove it?
Pass the test and this pattern moves unknown
