Шаблон проектирования прототипа относится к шаблону творческого проектирования. Как и в предыдущих двух шаблонах проектирования, мы не будем использовать ключевое слово new для явного создания объекта. Но именно здесь шаблон проектирования прототипа отличается от шаблона проектирования singleton и factory. В шаблоне Prototype Design вместо вызова конструктора для создания экземпляров мы будем клонировать готовый экземпляр, а затем изменить необходимую информацию для использования. Для этого у нас будет класс реестра, который будет создавать и хранить один единственный экземпляр классов, которые мы собираемся использовать.

Чтобы клонировать объекты, мы реализуем интерфейс Cloneable, а также переопределим метод clone () в родительском классе. (Если вы используете только один класс, его можно реализовать там.) С помощью этого метода clone () мы будем копировать из одного экземпляра для создания новых экземпляров. Эти новые экземпляры будут иметь те же атрибуты, что и оригинал. Мы можем использовать два типа копирования;

  1. Мелкая копия
  2. Глубокая копия

Я покажу реализацию шаблона проектирования прототипа с мелкой копией для сценария ниже.

Выполнение

Для реализации мы будем внедрять систему продажи недвижимости. Для этого у нас будет абстрактный класс под названием Свойство. Посмотрите на приведенный ниже код.

Как видно из вышесказанного, у класса есть две переменные экземпляра: цена и владелец. У этого класса нет настраиваемого конструктора, поэтому значения будут установлены с помощью установщиков. В этом классе также реализован интерфейс Cloneable, поэтому метод clone () был переопределен. Затем с этим классом я создал два подкласса, которые расширяются от класса Property, как показано ниже.

Вышеупомянутые классы являются подклассами, и эти подклассы имеют уникальное свойство для них обоих: noOfRoooms для класса House и area для класса Property. Как и в случае с родительским классом, для этих классов также нет специального конструктора. Мы будем устанавливать значения с помощью сеттеров. У них также есть метод печати, который будет печатать подробную информацию о подклассах.

У нас есть подклассы, поэтому следующим шагом будет создание класса Register. Ниже представлена ​​реализация класса Register.

Как видите, у класса реестра будет конструктор, и в этом конструкторе мы будем вызывать метод инициализации. (Вы также можете напрямую поместить метод инициализации внутрь самого конструктора). Инициализация будет местом, где создается экземпляр подклассов, другими словами, скелетный объект, на котором будет основан каждый экземпляр. И я использую HashMap для хранения инициализированных объектов.

Примечание: вместо HashMaps вы, ребята, можете использовать класс коллекции, который вам нужен, например, ArrayList, HashMap хорош, поскольку мы можем легко идентифицировать и получать желаемый объект, анализируя идентификатор, который является перечислением PropertyType, которое Я создал.

Следующим важным моментом, который следует здесь отметить, является метод getProperty (), который будет возвращать объект типа Property. Внутри метода используется метод clone, и клонированный объект будет возвращен.

Примечание. Поскольку свойство родительского класса реализовало интерфейс Cloneable, подклассы также могут использовать метод clone.

Теперь, когда у нас есть все, что нам нужно, последняя часть - это реализация основного метода.

Вышеупомянутый мой основной метод, некоторые могут подумать, что изменение значения в объекте также повлияет на другой объект, но для этого сценария этого не происходит. Как видно из вывода ниже.

Причина в том, что примитивные переменные будут иметь новую копию. Но вы можете подумать, что String - это ссылочный тип, как он не изменился даже после его изменения. Причина в том, что String является неизменяемым, поэтому при изменении строкового значения для него создается новая область памяти, и объект k2 будет указывать на нее.

Вышеупомянутая реализация подходит только для строковых и примитивных типов внутри объекта, но если в подклассах используется другой тип объекта, мы не можем выполнять поверхностное копирование и должны выполнять глубокое копирование.

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

Теперь, когда мы знаем, как создать шаблон прототипа, есть несколько важных моментов, на которые следует обратить внимание при использовании этого шаблона.

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

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА

Часть 1 Шаблон дизайна: Щелкните здесь

Часть 2 Шаблон дизайна: Щелкните здесь

Щелкните здесь, чтобы увидеть приведенные выше коды в моем Github.

Это видео от Кришанты Динеш очень помогло при написании этой статьи.