README
1 min read18 headings
21.4 Design Patterns
Overview
Design patterns are reusable solutions to common programming problems. This section covers essential JavaScript design patterns for building maintainable, scalable applications.
Pattern Categories
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Design Pattern Categories β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β CREATIONAL STRUCTURAL BEHAVIORAL β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β Singleton β β Adapter β β Observer β β
β β Factory β β Decorator β β Strategy β β
β β Builder β β Facade β β Command β β
β β Prototype β β Proxy β β Iterator β β
β β Module β β Composite β β Mediator β β
β ββββββββββββββ ββββββββββββββ β State β β
β β β β Chain β β
β βΌ βΌ ββββββββββββββ β
β How objects How objects β β
β are created are composed βΌ β
β How objects β
β communicate β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Creational Patterns
Singleton Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Singleton Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Ensure a class has only one instance β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Singleton β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β - instance: Singleton β β β
β β β + getInstance(): Singleton β β β
β β β - constructor() β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Use Cases: β
β β’ Configuration managers β
β β’ Connection pools β
β β’ Logging services β
β β’ Application state β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Factory Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Factory Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Create objects without specifying exact class β
β β
β ββββββββββββββββ β
β β Factory β β
β β createProductβ β
β ββββββββ¬ββββββββ β
β β β
β βββββββββββββββΌββββββββββββββ β
β βΌ βΌ βΌ β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β ProductA β β ProductB β β ProductC β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β
β Types: β
β β’ Simple Factory - single method creates objects β
β β’ Factory Method - subclasses decide instantiation β
β β’ Abstract Factory - families of related objects β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Builder Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Builder Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Construct complex objects step by step β
β β
β new UserBuilder() β
β .setName('John') βββββββββββββββββββ β
β .setEmail('j@e.com') ββββΊ β Builder β ββββΊ User Object β
β .setAge(25) β (step by step) β β
β .build() βββββββββββββββββββ β
β β
β Benefits: β
β β’ Clear construction process β
β β’ Optional parameters handled elegantly β
β β’ Immutable objects possible β
β β’ Fluent interface (method chaining) β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Structural Patterns
Module Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Module Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Encapsulate related code with public/private members β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Module β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Private Scope (Closure) β β β
β β β βββ privateVar β β β
β β β βββ privateMethod() β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β β β Public API (Returned Object) β β β
β β β βββ publicVar β β β
β β β βββ publicMethod() β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Modern: ES Modules (import/export) provide native module support β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Decorator Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Decorator Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Add behavior to objects dynamically β
β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Coffee ββββββΊβ MilkDecoratorββββββΊβSugarDecoratorβ β
β β $5.00 β β +$0.50 β β +$0.25 β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β β
β βΌ β
β Total: $5.75 β
β β
β In JavaScript: β
β β’ Function wrappers β
β β’ Class decorators (Stage 3) β
β β’ Higher-order functions β
β β’ Proxy objects β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Proxy Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Proxy Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Control access to an object β
β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β Client βββββββΊβ Proxy βββββββΊβ Target β β
β ββββββββββββ ββββββββββββ ββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββββββ β
β β β’ Validation β β
β β β’ Caching β β
β β β’ Lazy loading β β
β β β’ Logging β β
β β β’ Access control β β
β ββββββββββββββββββββββββββ β
β β
β JavaScript Proxy API: β
β const proxy = new Proxy(target, { β
β get(target, prop) { ... }, β
β set(target, prop, value) { ... } β
β }); β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Facade Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Facade Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Provide simplified interface to complex subsystem β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Facade β β
β β (Simple Interface) β β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββΌβββββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β Subsystem A β β Subsystem B β β Subsystem C β β
β β (Complex) β β (Complex) β β (Complex) β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β
β Example: jQuery's $() is a facade over DOM APIs β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Behavioral Patterns
Observer Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Observer Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Define one-to-many dependency for state updates β
β β
β ββββββββββββββββ β
β β Subject β β
β β (Publisher) β β
β ββββββββ¬ββββββββ β
β β notify() β
β ββββββββββββββΌβββββββββββββ β
β βΌ βΌ βΌ β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β Observer1 β β Observer2 β β Observer3 β β
β β update() β β update() β β update() β β
β βββββββββββββ βββββββββββββ βββββββββββββ β
β β
β JavaScript Implementations: β
β β’ EventEmitter (Node.js) β
β β’ addEventListener (DOM) β
β β’ RxJS Observables β
β β’ Custom pub/sub systems β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Strategy Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Strategy Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Define family of algorithms, make them interchangeable β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Context β β
β β setStrategy(strategy) β β
β β executeStrategy() β β
β βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββββββββββ β
β β Strategy (interface) β β
β β execute() β β
β ββββββββββββ¬ββββββββββββββββ β
β ββββββββββββββββββΌβββββββββββββββββ β
β βΌ βΌ βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β StrategyA β β StrategyB β β StrategyC β β
β β execute() β β execute() β β execute() β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
β Example: Different sorting algorithms, payment methods β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Command Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Command Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Encapsulate requests as objects β
β β
β βββββββββββ βββββββββββ βββββββββββ ββββββββββββ β
β β Invoker ββββββΊβ Command ββββββΊβReceiver ββββββΊβ Action β β
β βββββββββββ βexecute()β β β β β β
β βundo() β βββββββββββ ββββββββββββ β
β βββββββββββ β
β β
β Benefits: β
β β’ Undo/Redo support β
β β’ Queuing and logging β
β β’ Transactional behavior β
β β’ Macro commands β
β β
β Example: Text editor commands, transactions β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
State Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β State Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Allow object to alter behavior when state changes β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Context β β
β β currentState: State β β
β β request() β state.handle() β β
β βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββΌβββββββββββββββββ β
β βΌ βΌ βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β StateA β β StateB β β StateC β β
β β handle() β β handle() β β handle() β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
β Example: Traffic light, order status, game characters β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Chain of Responsibility
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Chain of Responsibility Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Pass request along chain until handled β
β β
β Request β
β β β
β βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Handler 1 βββββΊβ Handler 2 βββββΊβ Handler 3 β β
β β (can't β β (can't β β (HANDLES!) β β
β β handle) β β handle) β β β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
β JavaScript Examples: β
β β’ Express middleware β
β β’ DOM event bubbling β
β β’ Promise chains β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Middleware Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Middleware Pattern β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Purpose: Process data through series of transformations β
β β
β Request βββΊ [Auth] βββΊ [Logger] βββΊ [Validator] βββΊ Handler β
β β β
β Response βββ [Compress] βββ [Format] ββββββββββββββββββββ β
β β
β Composition: β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β app.use(middleware1); β β
β β app.use(middleware2); β β
β β app.use(middleware3); β β
β β β β
β β // Each middleware calls next() to pass control β β
β β function middleware(req, res, next) { β β
β β // do work β β
β β next(); β β
β β } β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Pub/Sub vs Observer
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Pub/Sub vs Observer β
βββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββ€
β Observer β Pub/Sub β
βββββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββ€
β β β
β Subject ββββΊ Observers β Publishers β
β (Tight coupling) β βΌ β
β β βββββββββββββββββββ β
β Subject knows observers β β Event Channel β β
β Observers know subject β β (Message Bus) β β
β β βββββββββββββββββββ β
β β βΌ β
β Synchronous notifications β Subscribers β
β β (Loose coupling) β
β β β
β β Publishers don't know subscribers β
β β Async possible β
β β β
βββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββ
When to Use Each Pattern
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Pattern Selection Guide β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Need Pattern β
β βββββββββββββββββββββββββββββββββββββ βββββββββββββββββββββββ β
β Single global instance Singleton β
β Create objects without specifying type Factory β
β Complex object construction Builder β
β Add behavior without inheritance Decorator β
β Control object access Proxy β
β Simplify complex interface Facade β
β Notify dependents of state changes Observer β
β Switch algorithms at runtime Strategy β
β Encapsulate actions as objects Command β
β Object behavior depends on state State β
β Sequential request handling Chain of Responsibility β
β Process data through stages Middleware β
β Loosely coupled event handling Pub/Sub β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Anti-Patterns to Avoid
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Common Anti-Patterns β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β God Object Too many responsibilities in one class β
β Spaghetti Code Tangled, unstructured code β
β Golden Hammer Using same pattern for everything β
β Copy-Paste Duplicating code instead of abstracting β
β Premature Opt Optimizing before measuring β
β Magic Numbers Hardcoded values without names β
β Callback Hell Deeply nested callbacks β
β Poltergeist Classes that just pass information β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Takeaways
- Choose wisely - Patterns are tools, not rules
- Don't force patterns - Use when they solve real problems
- Combine patterns - Many work well together
- Understand trade-offs - Each pattern has costs
- Keep it simple - Start simple, add patterns as needed
- Document usage - Make pattern usage clear to team
- Adapt to JavaScript - Patterns may differ from classical OOP
Files in This Section
README.md- This documentationexamples.js- Design pattern implementationsexercises.js- Pattern implementation exercises