Wzorce projektowe - wzorzec prototypowy
Wzorzec prototypowy odnosi się do tworzenia zduplikowanych obiektów z uwzględnieniem wydajności. Ten typ wzorca projektowego wchodzi w zakres wzorca kreacyjnego, ponieważ ten wzorzec zapewnia jeden z najlepszych sposobów tworzenia obiektu.
Ten wzorzec obejmuje implementację prototypowego interfejsu, który mówi, aby utworzyć klon bieżącego obiektu. Ten wzorzec jest używany, gdy bezpośrednie tworzenie obiektu jest kosztowne. Na przykład obiekt ma zostać utworzony po kosztownej operacji na bazie danych. Możemy buforować obiekt, zwracać jego klon na następne żądanie i aktualizować bazę danych w razie potrzeby, zmniejszając w ten sposób liczbę wywołań bazy danych.
Realizacja
Stworzymy abstrakcyjną klasę Shape i konkretne klasy rozszerzające klasę Shape . Klasa ShapeCache jest zdefiniowany jako następny krok, który sprzeciwia kształt sklepów w Hashtable i zwraca ich klona żądanie.
PrototypPatternDemo , nasza klasa demonstracyjna użyje klasy ShapeCache do pobrania obiektu Shape .
Krok 1
Utwórz klasę abstrakcyjną implementującą interfejs Clonable .
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;
}
}
Krok 2
Utwórz konkretne klasy rozszerzające powyższą klasę.
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.");
}
}
Krok 3
Utwórz klasę, aby pobrać konkretne klasy z bazy danych i przechowywać je w tablicy z haszowaniem .
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);
}
}
Krok 4
PrototypePatternDemo wykorzystuje ShapeCache klasę uzyskać klony kształtach przechowywanych w Hashtable .
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());
}
}
Krok 5
Sprawdź dane wyjściowe.
Shape : Circle
Shape : Square
Shape : Rectangle