Нарушает ли шаблон «Прототип» принцип подстановки Лискова? ⇐ JAVA
-
Anonymous
Нарушает ли шаблон «Прототип» принцип подстановки Лискова?
Я пересматриваю шаблоны проектирования, особенно те, которые я не использовал какое-то время или вообще не использовал. И один из них — паттерн Прототип.
В разных источниках (например, в этом) говорится, что вам следует реализовать интерфейс Clonable и переопределить метод clone() для реализации шаблона прототипа в Java. Но там также говорится:
Реализация clone() может быть затруднена, если их внутренние компоненты включают объекты, которые не поддерживают копирование или имеют циклические ссылки.
Для меня это имеет смысл, например. если существует некий суперкласс GameCharacter и дюжина дочерних классов, которые имеют одно и то же базовое состояние, но некоторые из них могут быть «уникальными» (т. е. не клонируемыми), а некоторые нет (т. е. клонируемыми).
Но не нарушает ли это принцип замены Лискова? Там написано
объекты суперкласса должны иметь возможность заменяться объектами подкласса без ущерба для корректности программы
но в описанном выше случае будет нарушен LSP, верно? Неклонируемые объекты будут вызывать исключение CloneNotSupportedException в случае вызова clone(), что влияет на корректность работы программы. Я что-то упустил?
Хотя я еще не работал с действительно огромными классами, до сих пор я всегда использовал конструкторы, подобные приведенным ниже, и они хорошо справлялись со своей задачей:
@Getter @Сеттер общественный класс Tst { частная строка prop1; частный Prop2 prop2; ...... общественный Tst (Tst sourceObj) { Tst targetObj = новый Tst() this.setProp1(sourceObj.getProp1()) this.setProp2(новый Prop2(sourceObj.getProp2())) ..... } } Вы помещаете такой конструктор в тот класс, где он нужен, и вызываете его в нужном месте с помощью приведения.
Итак, есть ли реальные случаи, когда паттерн «Прототип» сегодня приносит большую прибыль? Или в большинстве случаев это просто перебор?
Я пересматриваю шаблоны проектирования, особенно те, которые я не использовал какое-то время или вообще не использовал. И один из них — паттерн Прототип.
В разных источниках (например, в этом) говорится, что вам следует реализовать интерфейс Clonable и переопределить метод clone() для реализации шаблона прототипа в Java. Но там также говорится:
Реализация clone() может быть затруднена, если их внутренние компоненты включают объекты, которые не поддерживают копирование или имеют циклические ссылки.
Для меня это имеет смысл, например. если существует некий суперкласс GameCharacter и дюжина дочерних классов, которые имеют одно и то же базовое состояние, но некоторые из них могут быть «уникальными» (т. е. не клонируемыми), а некоторые нет (т. е. клонируемыми).
Но не нарушает ли это принцип замены Лискова? Там написано
объекты суперкласса должны иметь возможность заменяться объектами подкласса без ущерба для корректности программы
но в описанном выше случае будет нарушен LSP, верно? Неклонируемые объекты будут вызывать исключение CloneNotSupportedException в случае вызова clone(), что влияет на корректность работы программы. Я что-то упустил?
Хотя я еще не работал с действительно огромными классами, до сих пор я всегда использовал конструкторы, подобные приведенным ниже, и они хорошо справлялись со своей задачей:
@Getter @Сеттер общественный класс Tst { частная строка prop1; частный Prop2 prop2; ...... общественный Tst (Tst sourceObj) { Tst targetObj = новый Tst() this.setProp1(sourceObj.getProp1()) this.setProp2(новый Prop2(sourceObj.getProp2())) ..... } } Вы помещаете такой конструктор в тот класс, где он нужен, и вызываете его в нужном месте с помощью приведения.
Итак, есть ли реальные случаи, когда паттерн «Прототип» сегодня приносит большую прибыль? Или в большинстве случаев это просто перебор?
Мобильная версия