🧠 Design Patterns: Elements of Reusable OO Software

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four) β€” 1994

Tesis: GoF mendokumentasikan 23 solusi umum untuk masalah desain OOP yang muncul berulang-ulang di proyek berbeda. Bukan copy-paste code β€” ini blueprint yang kamu adaptasi ke konteksmu. Menguasai pola ini artinya kamu gak perlu reinvent the wheel tiap kali nemu masalah yang sama. Lebih penting lagi: pola memberi vocabulary bersama β€” bilang β€œpakai Observer” lebih cepat daripada jelasin pub/sub 5 menit.

Tapi hati-hati: Pola bukan tujuan. Jangan paksa pola ke masalah yang gak cocok. GoF sendiri bilang: pilih pola berdasarkan apa yang berubah di desainmu, bukan karena keren. Akronim Gang of Four sendiri diambil dari nama keempat penulis: Gamma, Helm, Johnson, Vlissides β€” bukan geng kriminal.


πŸ“Œ Kenapa Penting

  • Bahasa universal tim. β€œPakai Factory method, bukan switch statement” = komunikasi 5 detik. Tanpa pola: jelasin 5 menit + gambar diagram + 3 kali ulang.
  • Pola lahir dari pengalaman, bukan teori. Setiap pola ditemukan karena orang menghadapi masalah yang sama berkali-kali dan nemuin solusi yang works. Battle-tested di puluhan bahasa dan domain.
  • Framework modern = implementasi pola. Spring β†’ Factory + Proxy + Template. React β†’ Observer + Composite + Strategy. Django β†’ Template Method + Command. Tanpa sadar kamu mungkin udah pake pola tiap hari.
  • Antidote untuk kode kaku. Pola ngajarin favor composition over inheritance β€” prinsip yang bikin kode gampang diubah tanpa ngerusak yang lain.
  • Jembatan antara requirement dan implementasi. β€œSaya perlu nambah behavior tanpa edit class asli” β†’ otak langsung loncat ke Decorator atau Strategy.

3 Kategori Pola

1. Creational (5) β€” Urusan buat object

Prinsip: Pisahkan apa yang dibuat dari bagaimana cara membuatnya. Client gak perlu tahu class konkrit.

PolaGunaContohKode singkat
SingletonSatu instance globalDB connection, loggerclass Logger { static getInstance() { ... } }
Factory MethodSubclass menentukan classFramework hookclass Dialog { createButton() } β†’ class WindowsDialog { createButton() { return new WinButton() } }
Abstract FactoryFamily of related objectsUI toolkit (Windows vs Mac)class GUIFactory { createButton(); createCheckbox() } β†’ 2 implementasi
BuilderComplex object constructionQuery builder, StringBuildernew PizzaBuilder().setSize(12).addCheese().build()
PrototypeClone objectCell duplication spreadsheetcell.clone() // deep copy, lalu modifikasi

Kapan pilih yang mana:

  • Singleton β€” pas butuh shared state (config, cache). Tapi hati-hati: bikin test susah karena global state.
  • Factory Method β€” pas framework mau ngasih hook buat client override.
  • Abstract Factory β€” pas produk harus konsisten satu keluarga (jangan Windows Button + Mac Checkbox).
  • Builder β€” pas constructor butuh 10+ parameter atau ada variasi konfigurasi.
  • Prototype β€” pas bikin object dari scratch mahal (query DB, network call).

2. Structural (7) β€” Urusan komposisi class/object

Prinsip: Gunakan komposisi dan pewarisan buat nyusun struktur yang fleksibel.

PolaGunaContohAnalogi
AdapterMake incompatible interfaces workCharger EU ke colokan ASAdaptor listrik
BridgeAbstraksi terpisah dari implementasiRemote TV (abstrak) β†’ Sony/Samsung TV (implementasi)Remote universal
CompositeTreat individual & composition uniformlyFile system: file vs folderKotak di dalam kotak
DecoratorAdd behavior dynamically (wrap)Java I/O: new BufferedInputStream(new FileInputStream())Baju lapis-lapis
FacadeSimplified interface to subsystemComputer.start() β†’ urus CPU, RAM, GPU di dalemResepsionis hotel
FlyweightShare fine-grained objects (save memory)Rendering font: char β€˜a’ di-share semua paragraphKolam renang publik
ProxyControl access to another objectLazy loading gambar, auth proxy, cachingAsisten pribadi

Kapan pilih yang mana:

  • Adapter β€” punya class lama dengan interface beda, tapi butuh dipake di system baru.
  • Bridge β€” abstraksi DAN implementasi sama-sama bisa berubah (misal: mau ganti TV brand DAN ganti remote model).
  • Composite β€” struktur pohon di mana leaf dan composite harus dipanggil sama (file/folder, UI tree).
  • Decorator β€” butuh nambah behavior tanpa ubah class, dan kombinasinya banyak (logging + caching + auth).
  • Facade β€” subsystem kompleks tapi client cuma butuh 2-3 operasi.
  • Flyweight β€” object kecil jumlahnya ribuan dan state intrinsiknya bisa di-share.
  • Proxy β€” butuh kontrol akses, lazy init, atau logging tanpa ubah class asli.

3. Behavioral (11) β€” Urusan interaksi & komunikasi antar object

Prinsip: Atur alur komunikasi biar object-object gak saling tahu detail internal satu sama lain.

PolaGunaContohAnalogi
StrategyFamily algorithms, interchangeableValidator berbed-beda: regex, length, customPilih jenis kopi (espresso, latte, manual brew)
ObserverOne-to-many notification (pub/sub)Event listener, store subscribeYouTube subscriber β€” uploader notify semua subscriber
CommandEncapsulate request as objectUndo/redo, queue task, macroPesanan di restoran: waiter β†’ koki (waiter gak masak sendiri)
IteratorSequential access, hide structureforeach loop, database cursorRemote AC next channel
Template MethodSkeleton algorithm, subclasses fill stepsDataProcessor.parse()->extract()->transform()->load()Resep masakan: β€œrebus air” tetap, β€œbumbu” opsional
StateBehavior changes when state changesVending machine: tunggu koin β†’ pilih β†’ deliverLampu lalu lintas: merah β†’ ijo β†’ kuning
VisitorNew operation without changing elementsAST visitor, export ke HTML/PDF/JSONKurir: beda rumah beda perlakuan
MediatorReduce chaotic couplingChat room β†’ semua pesan lewat room, gak langsung ke orangTower bandara ngatur pesawat landing/takeoff
Chain of RespMultiple handlers for one requestMiddleware Express.js: auth β†’ logging β†’ cache β†’ routeCS: β€œsaya bisa bantu?” β†’ supervisor β†’ manager
MementoCapture & restore internal state (undo)Ctrl+Z di editor, save game checkpointSave point di game
InterpreterGrammar for simple languageRegex engine, SQL parser, DSL sederhanaPenerjemah bahasa isyarat

Kapan pilih yang mana:

  • Strategy β€” banyak cara ngelakuin hal yang sama, dan klien milih salah satu di runtime.
  • Observer β€” satu perubahan butuh notify banyak object, tapi gak mau tight coupling.
  • Command β€” butuh queue, retry, undo, atau log tiap request.
  • Template Method β€” algoritma sama, langkah-langkah tertentu bisa di-override subclass.
  • State β€” object berubah perilaku drastis tergantung state internal (gak pake if/else raksasa).
  • Visitor β€” struktur object stabil tapi operasi yang bisa ditambah terus.
  • Mediator β€” banyak object saling komunikasi, udah mulai chaotic.
  • Chain of Resp β€” gak tahu handler mana yang bakal proses request, atau handler bisa ditambah kapan aja.
  • Memento β€” butuh save/restore state tanpa ngebreak encapsulation.

πŸ“– Bab Penting & Porsi Bacaan

BabJudulPrioritasWaktu baca
1Introductionβœ… Wajib~30 menit β€” paham klasifikasi pola & kapan pakai
2Case Study: Text Editor⭐ Rekomendasi~45 menit β€” lihat pola in action
Creational (ch. 3-5)5 polaβœ… Wajib (Factory + Abstract Factory)~1 jam
Structural (ch. 6-9)7 pola⭐ Rekomendasi (Composite + Decorator)~1.5 jam
Behavioral (ch. 10-13)11 polaβœ… Wajib (Strategy + Observer)~2 jam
AppendixReferensiπŸ“– PelengkapLompat aja

Strategi baca:

  1. Baca Bab 1 dulu β€” paham kategorisasi
  2. Loncat ke Strategy + Observer β€” paling sering dipake
  3. Baca pola pas butuh aja (just-in-time learning)
  4. Jangan baca cover-to-cover β€” ini katalog, bukan novel

⚠️ Kritik & Konteks

KritikPenjelasanKapan Diabaikan
Kode contoh C++/SmalltalkBahasa contoh udah 30 tahun. Banyak polanya sekarang built-in di framework modern.Baca pseudocode di Wikipedia β€” lebih mudah dipahami
Over-patternGara-gara baca GoF, orang jadi paksa Singleton buat class yang cuma instansiasi 1x padahal gak perluPola adalah alat, bukan identitas. Kalo masalahmu selesai dengan if-else, ya pake if-else
Bahasa OOP-centricPola di GoF asumsikan inheritance mutlak. Di JS/Go/Rust implementasinya bedaAdaptasi ke bahasa: closure bisa ganti Strategy, channel bisa ganti Observer
Banyak pola overlapStrategy vs State beda intent tapi struktur classnya miripFokus ke kapan dan kenapa, bukan bagaimana struktur class-nya
Catalog format membosankan23 pola Γ— 10 halaman = bacaan keringBaca 1 pola per hari, gak perlu buru-buru

Konteks 2026: Dari 23 pola, yang benar-benar dipake tiap hari di proyek modern sekitar 8-10 pola. Sisanya relevan di kasus spesifik. Prioritasin yang paling sering muncul:

  • High frequency: Singleton, Factory Method, Adapter, Observer, Strategy, Template Method, Composite, Decorator
  • Medium: Abstract Factory, Builder, Command, State, Proxy, Facade
  • Low (tapi penting tau): sisanya β€” pahamin konsep, detail implementasi cari pas butuh

🚦 Learning Path

1. Strategy + Observer ──────► paham OOP composition
         β”‚
2. Factory Method + Singleton ──► paham object creation
         β”‚
3. Adapter + Decorator ────► paham wrapping
         β”‚
4. Composite + Iterator ─────► paham tree structure
         β”‚
5. Command + State + Template ──► paham behavior changes
         β”‚
6. Visitor + Mediator ─────► paham complex interactions
         β”‚
7. Proxy + Facade + Chain ─────► paham access control

πŸ”— Koneksi ke Vault Lain

βœ… Checklist Praktik

  • Baca Bab 1 GoF β€” paham klasifikasi pola
  • Identifikasi 1 pola yang dipake framework yang kamu gunakan tiap hari
  • Refactor 1 kode: ganti if-else panjang dengan Strategy
  • Refactor 1 kode: ganti switch object creation dengan Factory Method
  • Cari Singleton abuse di codebase β€” ganti dengan dependency injection
  • Implementasi Observer sederhana (manual, tanpa library)
  • Implementasi Decorator: wrapping function dengan logging/caching
  • Pilih 1 pola baru per bulan β€” baca, implementasi, tulis catatan
  • Buat cheatsheet pribadi: 1 file markdown per pola (3-5 baris + contoh kode)