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
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
- Interfície Prototype: Defineix el mètode
clone()
que serà implementat per les classes concretes. - ConcretePrototype: Implementa la interfície
Prototype
i defineix el mètodeclone()
per crear una còpia de si mateix. - 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ó
- Classe Shape: Implementa la interfície
Prototype
i defineix el mètodeclone()
per crear una còpia de si mateixa. - 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.
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