Docs
22.1-Design-Patterns-Overview
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 documentation - β’
examples.js- Design pattern implementations - β’
exercises.js- Pattern implementation exercises