Это один из креативных шаблонов проектирования.
Используется для создания дубликатов/неполных копий данного объекта.
Этот шаблон полезен, когда непосредственное создание объектов является дорогостоящим. Пример: если объект создается после запроса к большой базе данных, то создание объекта снова и снова неэкономично с точки зрения производительности.
Следовательно, как только объект создан, мы кэшируем объект, и при необходимости того же объекта в будущем мы получаем его из кеша вместо того, чтобы создавать его снова из базы данных, и обновляем базу данных по мере необходимости, чтобы уменьшить количество вызовов базы данных. .
Примечание: нам придется использовать Cloneable, т. е. интерфейс маркера для объекта, который необходимо клонировать. Он (Clonable) не содержит никаких методов, он сигнализирует о том, что класс можно клонировать, что означает создание копии объект.
Метод Object.clone() создает неглубокую копию по умолчанию
По умолчанию метод clone() выполняет неполную копию объекта. Это означает, что он создает новый объект и копирует все поля исходного объекта в новый объект. Однако если объект содержит ссылки на другие объекты (например, массивы, списки или пользовательские объекты), копируются сами ссылки, а не фактические объекты, на которые они указывают.
В результате и исходный, и клонированный объект будут ссылаться на одни и те же объекты в этих полях. Любые изменения, внесенные в объекты, на которые ссылаются, в одном экземпляре, отразятся в другом.
Давайте разберемся в этом на примере объекта Shape, который можно клонировать.
Форма
public class Shape implements Cloneable { private String id; protected String shape; @Override public String toString() { return "Shape [id=" id ", shape=" shape "]"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getShape() { return shape; } @Override public Object clone(){ Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } }
Дочерние классы
public class Rectangle extends Shape { public Rectangle(){ shape = "Rectangle"; } public void draw(){ System.out.println("calling draw() of Rectangle shape"); } } public class Circle extends Shape { public Circle(){ shape = "Circle"; } public void draw(){ System.out.println("Calling draw in Circle method"); } }
Кэш
public class ShapeCache { public static HashMapcache = new HashMap(); public static Shape cloneObject(String id){ return (Shape)cache.get(id); } public static void addShapeInCache(Shape shape){ cache.put(shape.getId(),shape); } }
Основной
public class Main { public static void main(String args[]){ Shape circle = new Circle(); circle.setId("1"); Shape rectangle = new Rectangle(); rectangle.setId("2"); ShapeCache.addShapeInCache(rectangle); ShapeCache.addShapeInCache(circle); Shape copyShape1 = (Shape) ShapeCache.cache.get(circle.getId()); Shape copyShape2 =(Shape) ShapeCache.cache.get(rectangle.getId()); System.out.println(copyShape1); System.out.println(copyShape2); } }
Выход:
Shape [id=1, shape=Circle] Shape [id=2, shape=Rectangle]
Ключевые моменты
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3