Entwurfsmuster - Prototypmuster
Das Prototypmuster bezieht sich auf das Erstellen eines doppelten Objekts unter Berücksichtigung der Leistung. Diese Art von Entwurfsmuster fällt unter das Erstellungsmuster, da dieses Muster eine der besten Möglichkeiten zum Erstellen eines Objekts bietet.
Dieses Muster beinhaltet die Implementierung einer Prototypschnittstelle, die anweist, einen Klon des aktuellen Objekts zu erstellen. Dieses Muster wird verwendet, wenn die direkte Erstellung eines Objekts kostspielig ist. Beispielsweise soll ein Objekt nach einer kostspieligen Datenbankoperation erstellt werden. Wir können das Objekt zwischenspeichern, seinen Klon bei der nächsten Anforderung zurückgeben und die Datenbank bei Bedarf aktualisieren, wodurch Datenbankaufrufe reduziert werden.
Implementierung
Wir werden eine abstrakte Klasse Shape und konkrete Klassen erstellen , die die Shape- Klasse erweitern. Eine Klasse ShapeCache wird als nächster Schritt definiert die Form speichert in einem Objekt Hashtable und gibt sie Klon , wenn angefordert.
PrototypPatternDemo , unsere Demo-Klasse, verwendet die ShapeCache- Klasse, um ein Shape- Objekt abzurufen .
Schritt 1
Erstellen Sie eine abstrakte Klasse, die die klonbare Schnittstelle implementiert .
Shape.java
public abstract class Shape implements Cloneable {
private String id;
protected String type;
abstract void draw();
public String getType(){
return type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object clone() {
Object clone = null;
try {
clone = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return clone;
}
}
Schritt 2
Erstellen Sie konkrete Klassen, die die obige Klasse erweitern.
Rectangle.java
public class Rectangle extends Shape {
public Rectangle(){
type = "Rectangle";
}
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Square.java
public class Square extends Shape {
public Square(){
type = "Square";
}
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
Circle.java
public class Circle extends Shape {
public Circle(){
type = "Circle";
}
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
Schritt 3
Erstellen Sie eine Klasse, um konkrete Klassen aus der Datenbank abzurufen und in einer Hashtabelle zu speichern .
ShapeCache.java
import java.util.Hashtable;
public class ShapeCache {
private static Hashtable<String, Shape> shapeMap = new Hashtable<String, Shape>();
public static Shape getShape(String shapeId) {
Shape cachedShape = shapeMap.get(shapeId);
return (Shape) cachedShape.clone();
}
// for each shape run database query and create shape
// shapeMap.put(shapeKey, shape);
// for example, we are adding three shapes
public static void loadCache() {
Circle circle = new Circle();
circle.setId("1");
shapeMap.put(circle.getId(),circle);
Square square = new Square();
square.setId("2");
shapeMap.put(square.getId(),square);
Rectangle rectangle = new Rectangle();
rectangle.setId("3");
shapeMap.put(rectangle.getId(), rectangle);
}
}
Schritt 4
PrototypePatternDemo verwendet die ShapeCache- Klasse, um Klone von Formen abzurufen , die in einer Hashtable gespeichert sind .
PrototypePatternDemo.java
public class PrototypePatternDemo {
public static void main(String[] args) {
ShapeCache.loadCache();
Shape clonedShape = (Shape) ShapeCache.getShape("1");
System.out.println("Shape : " + clonedShape.getType());
Shape clonedShape2 = (Shape) ShapeCache.getShape("2");
System.out.println("Shape : " + clonedShape2.getType());
Shape clonedShape3 = (Shape) ShapeCache.getShape("3");
System.out.println("Shape : " + clonedShape3.getType());
}
}
Schritt 5
Überprüfen Sie die Ausgabe.
Shape : Circle
Shape : Square
Shape : Rectangle