Образец прототипа относится к созданию дублирующегося объекта с учетом производительности. Этот тип шаблона проектирования подпадает под шаблон создания, поскольку этот шаблон обеспечивает один из лучших способов создания объекта.
Этот шаблон включает в себя реализацию интерфейса прототипа, который говорит, чтобы создать клон текущего объекта. Этот шаблон используется, когда создание объекта напрямую является дорогостоящим. Например, объект должен быть создан после дорогостоящей операции с базой данных. Мы можем кэшировать объект, возвращать его клон при следующем запросе и обновлять базу данных по мере необходимости, уменьшая количество вызовов базы данных.
Реализация
Мы собираемся создать абстрактный класс Shape и конкретные классы, расширяющие класс Shape . Класс ShapeCache определяется как следующий шаг, который сохраняет объекты формы в Hashtable и возвращает их клон по запросу.
PrototypPatternDemo , наш демонстрационный класс будет использовать класс ShapeCache для получения объекта Shape .
Шаг 1
Создайте абстрактный класс, реализующий интерфейс 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; } }
Шаг 2
Создайте конкретные классы, расширяющие вышеуказанный класс.
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."); } }
Шаг 3
Создайте класс для получения конкретных классов из базы данных и сохраните их в Hashtable .
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); } }
Шаг 4
PrototypePatternDemo использует класс ShapeCache для получения клонов фигур, хранящихся в 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()); } }
Шаг 5
Проверьте вывод.