Vint-i-tres patrons són massa per abordar-los en desordre. Per això el Gang of Four els va organitzar en un mapa amb dos eixos —el propòsit del patró i el seu àmbit— que continua sent la manera estàndard de navegar pel catàleg. Aquesta lliçó és exactament això: el mapa del territori que recorreràs als mòduls 2, 3 i 4. Veuràs les tres famílies (creacionals, estructurals i de comportament), quina pregunta respon cadascuna, la taula completa dels 23 patrons amb el seu propòsit en una línia, i una menció a les famílies que van quedar fora del GoF i que visitarem al mòdul 6. No desenvoluparem cap patró individual: avui toca orientar-se, no excavar.
Contingut
- Els dos eixos de classificació del GoF
- Primer eix: el propòsit (les tres famílies)
- Els 23 patrons, família a família
- Segon eix: l'àmbit (classe davant d'objecte)
- Més enllà del GoF: altres famílies de patrons
- El mapa com a itinerari del curs
Els dos eixos de classificació del GoF
El llibre Design Patterns classifica els seus 23 patrons amb dos criteris ortogonals:
- Propòsit (purpose): quin tipus de problema resol el patró? Dona lloc a les tres famílies: creacionals (com es creen els objectes), estructurals (com es componen) i de comportament (com col·laboren i es reparteixen responsabilitats).
- Àmbit (scope): el patró opera sobre classes (relacions fixades en compilació, via herència) o sobre objectes (relacions establertes en execució, via composició)?
El primer eix és el que tothom fa servir per parlar de patrons i el que estructura aquest curs; el segon és més subtil però molt revelador, i el veurem a la secció 4.
Una intuïció útil per recordar les tres famílies amb PideYa: pensa en el cicle de vida dels objectes d'un sistema. Primer cal crear-los (qui fa el new de la passarel·la de pagament adequada?), després organitzar-los en estructures majors (com es munta un menú que conté plats i altres menús?), i finalment fer-los col·laborar (com s'assabenta el repartidor que la comanda ha canviat d'estat?). Creació → estructura → comportament.
flowchart LR
A[Creacionals<br/>Com neixen els objectes?] --> B[Estructurals<br/>Com es componen?]
B --> C[De comportament<br/>Com col·laboren?]
A -.-> M2[Mòdul 2]
B -.-> M3[Mòdul 3]
C -.-> M4[Mòdul 4]
Primer eix: el propòsit (les tres famílies)
Patrons creacionals (5 patrons → mòdul 2)
Pregunta que responen: com crear objectes sense que el codi quedi acoblat a les classes concretes que instancia, i com controlar quantes instàncies existeixen i com es munten les complexes?
Com vam veure en estudiar els principis de disseny, el new és el punt on inevitablement s'anomena una classe concreta. Els creacionals existeixen per aïllar i centralitzar aquests punts, de manera que la resta del sistema programi contra interfícies. A PideYa, són els patrons que respondran a "qui decideix si el pagament es processa amb la passarel·la de targeta o amb PayPal?" o "com es construeix una comanda amb línies, descomptes, adreça i propina sense un constructor de deu paràmetres?".
Patrons estructurals (7 patrons → mòdul 3)
Pregunta que responen: com combinar classes i objectes en estructures majors que continuïn sent flexibles i eficients?
Són els patrons de la composició: embolcallar un objecte per afegir-li alguna cosa, adaptar una interfície aliena a la que el teu codi espera, tractar igual un element i un grup d'elements, o donar una façana simple a un subsistema enrevessat. A PideYa apareixeran quan integrem l'API d'un proveïdor extern de pagaments que no encaixa amb les nostres interfícies, o quan modelem cartes que contenen seccions que contenen plats.
Patrons de comportament (11 patrons → mòdul 4)
Pregunta que responen: com repartir responsabilitats entre objectes i organitzar la comunicació entre ells perquè cadascun faci la seva feina sense acoblar-se a la resta?
És la família més nombrosa, perquè la col·laboració és el més difícil de dissenyar. Aquí viuen els patrons que resolen el problema de les notificacions de Comanda que vam veure a la primera lliçó, els que modelen el cicle d'estats d'una comanda (rebuda → en preparació → en repartiment → lliurada) i els que permeten intercanviar algorismes (estratègies de càlcul de despeses d'enviament) en temps d'execució.
Els 23 patrons, família a família
Aquí tens el catàleg complet. No intentis memoritzar-lo avui: fes-lo servir com un índex al qual tornar. Cada patró té la seva lliçó pròpia als mòduls 2–4.
Creacionals (mòdul 2)
| Patró | Propòsit en una línia |
|---|---|
| Singleton | Garantir que una classe tingui una única instància, amb accés global a ella |
| Factory Method | Delegar en subclasses la decisió de quina classe concreta instanciar |
| Abstract Factory | Crear famílies completes d'objectes relacionats sense anomenar les seves classes concretes |
| Builder | Construir objectes complexos pas a pas, separant la construcció de la representació |
| Prototype | Crear objectes nous clonant instàncies prototip existents |
Estructurals (mòdul 3)
| Patró | Propòsit en una línia |
|---|---|
| Adapter | Convertir la interfície d'una classe en una altra que el client espera |
| Bridge | Desacoblar una abstracció de la seva implementació perquè totes dues variïn per separat |
| Composite | Compondre objectes en arbres i tractar igual objectes individuals i composicions |
| Decorator | Afegir responsabilitats a un objecte dinàmicament, embolcallant-lo |
| Facade | Oferir una interfície unificada i simple a un subsistema complex |
| Flyweight | Compartir eficientment molts objectes de gra fi amb estat comú |
| Proxy | Proporcionar un substitut d'un altre objecte per controlar-hi l'accés |
De comportament (mòdul 4)
| Patró | Propòsit en una línia |
|---|---|
| Chain of Responsibility | Passar una petició per una cadena de manipuladors fins que un l'atengui |
| Command | Encapsular una petició com a objecte, permetent cues, registres i desfer |
| Interpreter | Definir la gramàtica d'un minillenguatge i un intèrpret per avaluar-la |
| Iterator | Recórrer els elements d'una col·lecció sense exposar-ne la representació interna |
| Mediator | Centralitzar en un objecte la comunicació entre un grup d'objectes |
| Memento | Capturar i restaurar l'estat intern d'un objecte sense violar-ne l'encapsulació |
| Observer | Notificar automàticament a múltiples objectes els canvis d'estat d'un altre |
| State | Permetre que un objecte canviï de comportament quan canvia el seu estat intern |
| Strategy | Encapsular algorismes intercanviables i fer-los substituïbles en execució |
| Template Method | Fixar l'esquelet d'un algorisme deixant passos concrets a les subclasses |
| Visitor | Afegir operacions noves a una jerarquia d'objectes sense modificar-ne les classes |
Recompte: 5 + 7 + 11 = 23. Com a referència d'importància pràctica: no tots pesen igual en el dia a dia. Singleton, Factory Method, Builder, Adapter, Decorator, Facade, Observer, Strategy, Template Method i Command apareixen constantment; Interpreter o Flyweight són molt més ocasionals. A les lliçons de cada patró i a les comparatives de tancament de cada mòdul (02-07, 03-09, 04-13) matisarem aquest pes relatiu.
Segon eix: l'àmbit (classe davant d'objecte)
El segon criteri del GoF pregunta com estableix el patró les seves relacions:
- Àmbit de classe: la relació clau es fixa mitjançant herència, en temps de compilació. Un cop compilat, el comportament està decidit.
- Àmbit d'objecte: la relació clau s'estableix mitjançant composició: referències entre objectes que es poden canviar en temps d'execució.
| Família | Àmbit de classe | Àmbit d'objecte |
|---|---|---|
| Creacionals | Factory Method | Abstract Factory, Builder, Prototype, Singleton |
| Estructurals | Adapter (variant de classe) | Adapter (variant d'objecte), Bridge, Composite, Decorator, Facade, Flyweight, Proxy |
| De comportament | Interpreter, Template Method | Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor |
Dues observacions valuoses d'aquesta taula:
- La immensa majoria de patrons són d'àmbit d'objecte. És la màxima "afavoreix la composició per sobre de l'herència" feta estadística: de 23 patrons, només un grapat es recolza en l'herència com a mecanisme central.
- Hi ha parelles de patrons que resolen problemes semblants, un per classe i l'altre per objecte (ho veuràs, per exemple, entre Template Method i Strategy, o entre les dues variants d'Adapter). Comprendre l'eix d'àmbit et donarà el criteri per triar: l'herència és més simple però rígida; la composició, més flexible però amb més peces.
Més enllà del GoF: altres famílies de patrons
El mapa del GoF cobreix el disseny de classes i objectes dins d'una aplicació orientada a objectes. Com vam veure a la lliçó d'història, la comunitat va continuar collint patrons en altres nivells. Les famílies que convé tenir al radar:
- Patrons arquitectònics: decideixen la forma global del sistema, no d'unes classes (capes, MVC, microkernel, broker...). Operen a una escala major que el GoF.
- Patrons de concurrència: coordinen fils i recursos compartits (productor-consumidor, thread pool, reactor...).
- Patrons d'empresa i integració: persistència, transaccions i missatgeria entre sistemes (Repository, Unit of Work, cues i canals...).
- Patrons de microserveis i sistemes distribuïts: resiliència i coordinació entre serveis remots (API Gateway, Circuit Breaker, Saga...).
Totes aquestes famílies es tracten al mòdul 6 (arquitectures modernes, microserveis, sistemes distribuïts i concurrència); aquí n'hi ha prou que situïs cadascuna a la seva escala:
flowchart TB
subgraph Escala
A["Arquitectònics<br/>(forma del sistema)"] --> B["GoF: disseny OO<br/>(classes i objectes)"]
B --> C["Idiomàtics<br/>(trucs propis d'un llenguatge)"]
end
D["Transversals per domini:<br/>concurrència, empresa,<br/>integració, distribuïts"] -.-> A
D -.-> B
El mapa com a itinerari del curs
Aquesta classificació no és només teoria: és literalment l'índex del que ve. El teu itinerari:
| Etapa | Família | On | Què sabràs en acabar |
|---|---|---|---|
| 1 | Creacionals | Mòdul 2 | Crear objectes sense acoblar-te a classes concretes |
| 2 | Estructurals | Mòdul 3 | Compondre objectes en estructures flexibles |
| 3 | De comportament | Mòdul 4 | Dissenyar col·laboracions desacoblades |
| 4 | Aplicació i criteri | Mòdul 5 | Triar patró, refactoritzar i evitar antipatrons |
| 5 | Famílies modernes | Mòdul 6 | Arquitectura, microserveis, distribuïts i concurrència |
Cada mòdul de patrons segueix a més el mateix ritme: una introducció a la família, una lliçó per patró (amb el problema plantejat a PideYa) i una comparativa final per triar entre patrons semblants. L'ordre creacionals → estructurals → de comportament no és casual: replica el cicle natural crear → compondre → col·laborar, i cada família es recolza en les anteriors.
Errors Comuns i Consells
- Intentar memoritzar els 23 de cop. És inútil i desmoralitzador. Avui només necessites les tres preguntes de família (creació? estructura? col·laboració?) i saber que la taula existeix per consultar-la.
- Tractar la família com un calaix rígid. Alguns patrons tenen un peu a dos mons i a la pràctica es combinen constantment (una fàbrica que retorna estratègies, un composite recorregut per un visitor). La classificació orienta; no tanca.
- Ignorar l'eix d'àmbit. Gairebé tothom coneix les tres famílies i gairebé ningú l'eix classe/objecte, que és just el que explica per què existeixen parelles de patrons "bessons" i quin triar. Tenir-lo present et donarà avantatge als mòduls 3 i 4.
- Creure que el mapa GoF és tot el territori. Si només coneixes els 23, intentaràs resoldre amb ells problemes que pertanyen a una altra escala (arquitectura, distribució, concurrència). Part del criteri és saber quan el teu problema ni tan sols és d'aquesta família; el mòdul 6 existeix per a això.
- Consell: imprimeix o desa les tres taules de la secció 3. Tornar-hi després d'estudiar cada patró ("continuo estant d'acord amb aquesta línia de resum?") és una tècnica de repàs excel·lent: quan totes les línies et semblin òbvies, dominaràs el catàleg.
Exercicis
Exercici 1: classificar problemes de PideYa
Per a cada problema, indica quina família de patrons (creacional, estructural o de comportament) l'abordaria. No anomenis patrons concrets: raona només per la naturalesa del problema.
- Quan una comanda passa a "lliurada", se n'han d'assabentar el client, el sistema de fidelització i les estadístiques.
- El proveïdor extern de mapes té una API amb mètodes i tipus que no encaixen amb les interfícies de rutes de PideYa.
- Muntar un objecte
Comandavàlid exigeix combinar cistella, adreça, franja horària, descomptes i propina, amb moltes combinacions opcionals. - La carta d'un restaurant conté seccions, que contenen plats o subseccions, i cal calcular preus i al·lèrgens sobre el conjunt.
- Segons el país, PideYa ha de fer servir un joc complet i coherent de: passarel·la de pagament, calculadora d'impostos i formatador de tiquets.
Exercici 2: l'eix d'àmbit
Sense conèixer encara els patrons, raona: per què un patró d'àmbit d'objecte permet canviar el comportament en temps d'execució i un d'àmbit de classe no? Il·lustra-ho amb l'exemple del Repartidor i el seu Vehicle de la lliçó de principis.
Exercici 3: GoF o una altra família?
Indica si cada problema pertany al territori del GoF o a una altra família de patrons (arquitectònica, concurrència, distribuïts/empresa):
- Decidir si PideYa s'estructura com a monòlit en capes o com a microserveis.
- Evitar que dos fils que processen pagaments simultanis corrompin el saldo del moneder.
- Fer que la classe
Comandano conegui els detalls dels canals de notificació. - Reintentar i aïllar les crides al servei extern de pagaments quan aquest es degrada.
Solucions
Solució 1:
- De comportament: és un problema de comunicació/col·laboració entre objectes (notificar canvis sense acoblar-se).
- Estructural: cal fer encaixar interfícies incompatibles component/embolcallant objectes existents.
- Creacional: el problema és com construir un objecte complex amb moltes variants.
- Estructural: és una composició d'objectes en arbre tractant uniformement parts i conjunts.
- Creacional: cal crear famílies coherents d'objectes relacionats segons una condició (el país).
Solució 2: en un patró d'àmbit de classe, la relació s'estableix per herència: quin comportament té cada classe queda decidit en compilar, i un objecte no pot canviar de classe un cop creat. En un d'àmbit d'objecte, la relació és una referència a un altre objecte, i una referència es pot reassignar en qualsevol moment. Amb l'exemple: si modelem RepartidorEnMoto extends Repartidor, un repartidor "és" de moto per sempre (caldria destruir l'objecte i crear-ne un altre). Si Repartidor té un Vehicle, n'hi ha prou amb repartidor.assignarVehicle(new Bicicleta()) a mig torn: el comportament (temps de lliurament) canvia en calent sense canviar d'objecte.
Solució 3:
- Arquitectònica: decideix la forma global del sistema, una escala per sobre del disseny de classes (mòdul 6).
- Concurrència: coordinació de fils i estat compartit (mòdul 6).
- GoF: disseny de col·laboració entre classes dins de l'aplicació (mòdul 4).
- Distribuïts/microserveis: resiliència davant de serveis remots degradats (mòdul 6).
Conclusió
Ja tens el mapa complet: dos eixos de classificació (propòsit i àmbit), tres famílies amb la seva pregunta característica —creacionals: com neixen els objectes?; estructurals: com es componen?; de comportament: com col·laboren?—, la taula dels 23 patrons del GoF com a índex de consulta, i la ubicació de les famílies modernes (arquitectura, concurrència, empresa, distribuïts) que esperen al mòdul 6. També saps llegir el detall que gairebé tothom passa per alt: l'eix classe/objecte, que explica per què la composició domina el catàleg.
Abans de llançar-nos al primer patró queda una última parada, potser la que més maduresa professional aporta: sospesar honestament el que els patrons donen i el que costen, i aprendre a decidir quan usar-los i quan no. És la lliçó que tanca aquest mòdul: Avantatges i Desavantatges d'Usar Patrons de Disseny.
Curs de Patrons de Disseny de Programari
Mòdul 1: Introducció als Patrons de Disseny
- Què són els Patrons de Disseny?
- Història i Origen dels Patrons de Disseny
- Principis de Disseny: SOLID i Altres Fonaments
- UML Essencial per Entendre Patrons
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
- Introducció als Patrons Creacionals
- Singleton
- Factory Method
- Abstract Factory
- Builder
- Prototype
- Comparativa i Elecció de Patrons Creacionals
Mòdul 3: Patrons Estructurals
- Introducció als Patrons Estructurals
- Adapter
- Bridge
- Composite
- Decorator
- Facade
- Flyweight
- Proxy
- Comparativa i Elecció de Patrons Estructurals
Mòdul 4: Patrons de Comportament
- Introducció als Patrons de Comportament
- Chain of Responsibility
- Command
- Interpreter
- Iterator
- Mediator
- Memento
- Observer
- State
- Strategy
- Template Method
- Visitor
- Comparativa i Elecció de Patrons de Comportament
Mòdul 5: Aplicació de Patrons de Disseny
- Com Seleccionar el Patró Adequat
- Exemples Pràctics d'Ús de Patrons
- Patrons de Disseny en Projectes Reals
- Refactorització Usant Patrons de Disseny
- Antipatrons: Quan els Patrons es Tornen un Problema
Mòdul 6: Patrons de Disseny Avançats
- Patrons de Disseny en Arquitectures Modernes
- Patrons de Disseny en Microserveis
- Patrons de Disseny en Sistemes Distribuïts
- Patrons de Concurrència
- Patrons de Disseny en Desenvolupament Àgil
