Introducció

El patró de disseny Prototype és un patró creacional que permet copiar objectes existents sense necessitat de dependre de les seves classes concretes. Aquest patró és útil quan la creació d'una nova instància d'una classe és costosa o complexa. En lloc de crear una nova instància des de zero, es clona una instància existent.

Conceptes Clau

  • Clonació: Crear una còpia exacta d'un objecte existent.
  • Prototip: L'objecte que es clona.
  • Interfície Prototype: Defineix un mètode per clonar objectes.

Diagrama UML

+-------------------+
|   Prototype       |
|-------------------|
| +clone(): Object  |
+-------------------+
         ^
         |
+-------------------+
|   ConcretePrototype|
|-------------------|
| +clone(): Object  |
+-------------------+

Implementació

Pas 1: Crear la Interfície Prototype

public interface Prototype {
    Prototype clone();
}

Pas 2: Implementar la Classe ConcretePrototype

public class ConcretePrototype implements Prototype {
    private String field;

    public ConcretePrototype(String field) {
        this.field = field;
    }

    @Override
    public Prototype clone() {
        return new ConcretePrototype(this.field);
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
}

Pas 3: Utilitzar el Patró Prototype

public class PrototypeDemo {
    public static void main(String[] args) {
        ConcretePrototype original = new ConcretePrototype("Original");
        ConcretePrototype clone = (ConcretePrototype) original.clone();

        System.out.println("Original field: " + original.getField());
        System.out.println("Clone field: " + clone.getField());

        // Modificar el camp del clon
        clone.setField("Cloned");

        System.out.println("Original field after modification: " + original.getField());
        System.out.println("Clone field after modification: " + clone.getField());
    }
}

Explicació del Codi

  1. Interfície Prototype: Defineix el mètode clone() que serà implementat per les classes concretes.
  2. ConcretePrototype: Implementa la interfície Prototype i defineix el mètode clone() per crear una còpia de si mateix.
  3. PrototypeDemo: Demostra com es pot utilitzar el patró Prototype per clonar objectes. Es crea una instància original i després es clona. Es mostra com els canvis en el clon no afecten l'original.

Avantatges i Desavantatges

Avantatges

  • Redueix la complexitat de creació: Permet crear objectes complexos de manera més fàcil.
  • Millora el rendiment: Clonar un objecte pot ser més ràpid que crear-lo des de zero.
  • Flexibilitat: Permet crear noves instàncies dinàmicament en temps d'execució.

Desavantatges

  • Còpia profunda vs. còpia superficial: Pot ser complicat implementar la clonació si els objectes tenen referències a altres objectes.
  • Manteniment: Pot ser difícil mantenir el codi si hi ha molts objectes que necessiten ser clonats.

Exercici Pràctic

Enunciat

Implementa una classe Shape que representi una forma geomètrica amb un camp type (tipus de forma) i un camp color. Implementa la interfície Prototype per permetre la clonació de formes. Crea una classe ShapeDemo per demostrar la clonació de diferents formes.

Solució

public class Shape implements Prototype {
    private String type;
    private String color;

    public Shape(String type, String color) {
        this.type = type;
        this.color = color;
    }

    @Override
    public Prototype clone() {
        return new Shape(this.type, this.color);
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

public class ShapeDemo {
    public static void main(String[] args) {
        Shape circle = new Shape("Circle", "Red");
        Shape clonedCircle = (Shape) circle.clone();

        System.out.println("Original Shape: " + circle.getType() + ", " + circle.getColor());
        System.out.println("Cloned Shape: " + clonedCircle.getType() + ", " + clonedCircle.getColor());

        // Modificar el color del clon
        clonedCircle.setColor("Blue");

        System.out.println("Original Shape after modification: " + circle.getType() + ", " + circle.getColor());
        System.out.println("Cloned Shape after modification: " + clonedCircle.getType() + ", " + clonedCircle.getColor());
    }
}

Explicació de la Solució

  1. Classe Shape: Implementa la interfície Prototype i defineix el mètode clone() per crear una còpia de si mateixa.
  2. ShapeDemo: Demostra com es pot utilitzar el patró Prototype per clonar objectes Shape. Es crea una instància original i després es clona. Es mostra com els canvis en el clon no afecten l'original.

Resum

El patró Prototype és una solució eficient per crear còpies d'objectes existents, especialment quan la creació d'objectes és costosa o complexa. Aquest patró permet clonar objectes de manera flexible i dinàmica, millorant el rendiment i reduint la complexitat del codi. Tot i això, és important tenir en compte les diferències entre còpia profunda i còpia superficial per evitar problemes amb referències a altres objectes.

© Copyright 2024. Tots els drets reservats