Els patrons creacionals són un tipus de patrons de disseny que se centren en el procés de creació d'objectes. Aquests patrons proporcionen mecanismes per crear objectes de manera que es pugui controlar millor el procés de creació, evitant problemes com la creació directa d'objectes que poden portar a un codi menys flexible i més difícil de mantenir.
Objectius dels Patrons Creacionals
Els patrons creacionals tenen diversos objectius clau:
- Encapsulació de la Creació d'Objectes: Permeten encapsular la lògica de creació d'objectes, separant-la del codi que utilitza aquests objectes.
- Flexibilitat i Reutilització: Faciliten la creació d'objectes de manera flexible i reutilitzable, permetent canviar la manera com es creen els objectes sense afectar el codi que els utilitza.
- Reducció de la Complexitat: Redueixen la complexitat del codi, ja que la lògica de creació d'objectes es centralitza en un lloc específic.
- Control sobre el Procés de Creació: Proporcionen un control més gran sobre el procés de creació d'objectes, permetent aplicar patrons com el Singleton o el Prototype per assegurar que els objectes es creen de manera controlada.
Tipus de Patrons Creacionals
Hi ha diversos patrons creacionals, cadascun amb les seves pròpies característiques i usos específics. A continuació es presenten els més comuns:
- Singleton: Garanteix que una classe només tingui una instància i proporciona un punt d'accés global a aquesta instància.
- Factory Method: Defineix una interfície per crear un objecte, però permet que les subclasses decideixin quin tipus d'objecte crear.
- Abstract Factory: Proporciona una interfície per crear famílies d'objectes relacionats o dependents sense especificar les seves classes concretes.
- Builder: Separa la construcció d'un objecte complex de la seva representació, permetent crear diferents representacions amb el mateix procés de construcció.
- Prototype: Permet crear nous objectes copiant una instància existent, coneguda com a prototip.
Comparació dels Patrons Creacionals
A continuació es presenta una taula comparativa dels diferents patrons creacionals:
Patró | Propòsit | Exemple d'Ús |
---|---|---|
Singleton | Garanteix una única instància d'una classe i proporciona un punt d'accés global. | Gestió de configuracions globals, connexions a bases de dades. |
Factory Method | Defineix una interfície per crear objectes, permetent a les subclasses decidir la seva creació. | Creació de diferents tipus de documents en una aplicació d'oficina. |
Abstract Factory | Proporciona una interfície per crear famílies d'objectes relacionats. | Creació de components d'interfície d'usuari per a diferents sistemes operatius. |
Builder | Separa la construcció d'un objecte complex de la seva representació. | Construcció d'objectes complexos com cases, vehicles, etc. |
Prototype | Permet crear nous objectes copiant una instància existent. | Creació de nous objectes a partir d'un objecte prototip, com en jocs de rol. |
Exemples Pràctics
Singleton
public class Singleton { private static Singleton instance; private Singleton() { // Constructor privat per evitar la creació d'instàncies externes } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
Factory Method
public abstract class Product { // Mètodes del producte } public class ConcreteProductA extends Product { // Implementació del producte A } public class ConcreteProductB extends Product { // Implementació del producte B } public abstract class Creator { public abstract Product factoryMethod(); public void someOperation() { Product product = factoryMethod(); // Utilitzar el producte } } public class ConcreteCreatorA extends Creator { @Override public Product factoryMethod() { return new ConcreteProductA(); } } public class ConcreteCreatorB extends Creator { @Override public Product factoryMethod() { return new ConcreteProductB(); } }
Exercici Pràctic
Exercici
Implementa un patró Singleton per a una classe DatabaseConnection
que garanteixi que només hi hagi una connexió a la base de dades en tota l'aplicació.
Solució
public class DatabaseConnection { private static DatabaseConnection instance; private DatabaseConnection() { // Constructor privat per evitar la creació d'instàncies externes } public static DatabaseConnection getInstance() { if (instance == null) { instance = new DatabaseConnection(); } return instance; } public void connect() { // Lògica de connexió a la base de dades } public void disconnect() { // Lògica de desconnexió de la base de dades } }
Resum
Els patrons creacionals són essencials per gestionar la creació d'objectes de manera eficient i flexible. Hem vist els objectius principals d'aquests patrons, els tipus més comuns i alguns exemples pràctics. En els següents temes, explorarem cada un d'aquests patrons en detall, començant pel patró Singleton.
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
- Classificació dels Patrons de Disseny
- Avantatges i Desavantatges d'Usar Patrons de Disseny
Mòdul 2: Patrons Creacionals
Mòdul 3: 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
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
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 Disseny en Desenvolupament Àgil