Introducció

Els patrons de disseny són solucions generals reutilitzables per a problemes comuns que es presenten en el desenvolupament de programari. No són codi específic, sinó més aviat descripcions o plantilles sobre com resoldre un problema que es pot utilitzar en moltes situacions diferents.

Conceptes Clau

Definició

  • Patró de Disseny: Una solució documentada i provada per a un problema recurrent en el desenvolupament de programari.
  • Problema Recurrent: Un problema que es presenta sovint en diferents contextos dins del desenvolupament de programari.
  • Solució Reutilitzable: Una solució que es pot aplicar en diferents situacions sense necessitat de ser redissenyada des de zero.

Components d'un Patró de Disseny

  1. Nom del Patró: Un identificador únic que descriu el patró.
  2. Problema: La descripció del problema que el patró resol.
  3. Solució: La descripció de com resoldre el problema, incloent-hi diagrames i exemples de codi.
  4. Conseqüències: Els avantatges i desavantatges d'utilitzar el patró.

Exemples de Patrons de Disseny

Singleton

  • Problema: Necessitat de garantir que una classe només tingui una instància i proporcionar un punt d'accés global a aquesta instància.
  • Solució: Crear una classe amb un mètode que crea una nova instància de la classe si encara no existeix. Si ja existeix, retorna la instància existent.
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Factory Method

  • Problema: Necessitat de crear objectes sense especificar la classe exacta de l'objecte que serà creat.
  • Solució: Definir una interfície per crear un objecte, però deixar que les subclasses decideixin quina classe instanciar.
public abstract class Product {
    public abstract void use();
}

public class ConcreteProductA extends Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

public class ConcreteProductB extends Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}

public abstract class Creator {
    public abstract Product factoryMethod();

    public void someOperation() {
        Product product = factoryMethod();
        product.use();
    }
}

public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}

Avantatges d'Usar Patrons de Disseny

  • Reutilització: Els patrons de disseny proporcionen solucions provades que es poden reutilitzar en diferents projectes.
  • Estandardització: Faciliten la comunicació entre desenvolupadors, ja que proporcionen un llenguatge comú.
  • Eficiència: Redueixen el temps de desenvolupament, ja que no cal reinventar la roda per a problemes comuns.

Desavantatges d'Usar Patrons de Disseny

  • Complexitat: Alguns patrons poden afegir complexitat innecessària si s'utilitzen en situacions inadequades.
  • Sobrecàrrega: L'ús excessiu de patrons pot portar a un codi massa estructurat i difícil de mantenir.

Exercici Pràctic

Exercici 1: Implementar un Singleton

Implementa un patró Singleton en el teu llenguatge de programació preferit. Assegura't que només es pugui crear una instància de la classe.

Solució

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

Exercici 2: Crear una Fàbrica Simple

Implementa un patró Factory Method per crear diferents tipus de productes. Defineix una interfície Product i dues implementacions concretes ProductA i ProductB.

Solució

public interface Product {
    void use();
}

public class ProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using Product A");
    }
}

public class ProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using Product B");
    }
}

public abstract class Creator {
    public abstract Product factoryMethod();

    public void someOperation() {
        Product product = factoryMethod();
        product.use();
    }
}

public class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ProductA();
    }
}

public class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ProductB();
    }
}

Conclusió

Els patrons de disseny són eines poderoses que poden ajudar a resoldre problemes comuns en el desenvolupament de programari de manera eficient i estandarditzada. Comprendre i saber aplicar aquests patrons és essencial per a qualsevol desenvolupador que vulgui escriure codi net, reutilitzable i mantenible.

© Copyright 2024. Tots els drets reservats