«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Прототип

Прототип

Опубликовано 8 ноября 2024 г.
Просматривать:941

Prototype

Это один из креативных шаблонов проектирования.
Используется для создания дубликатов/неполных копий данного объекта.
Этот шаблон полезен, когда непосредственное создание объектов является дорогостоящим. Пример: если объект создается после запроса к большой базе данных, то создание объекта снова и снова неэкономично с точки зрения производительности.
Следовательно, как только объект создан, мы кэшируем объект, и при необходимости того же объекта в будущем мы получаем его из кеша вместо того, чтобы создавать его снова из базы данных, и обновляем базу данных по мере необходимости, чтобы уменьшить количество вызовов базы данных. .

Примечание: нам придется использовать 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 HashMap cache = 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]

Ключевые моменты

  • Как «Круг», так и «Прямоугольник» следуют принципу подстановки Лискова (принцип SOLID), который гласит, что Объект должен быть заменен своими подтипами, не влияя на корректность кода..
  • Создается только неполная копия объекта Shape.
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/prashantrmishra/prototype-15hn?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3