Я бы посмотрел на такие вещи, как (неофициальная) разработка GBA или тому подобное, конечно, есть «Библиотеки», но вы можете копаться и просто вставлять биты в конкретные адреса и делать вещи происходящими. Вы не можете получить больше «Нет API», чем доступ к оборудованию с отображением в памяти.
Таким образом, вы можете создать другой объект того же класса, не зная, что это за объект исходного класса - это может создать действительно изящный компактный фабричный шаблон.
В качестве примера это полезно когда у вас есть объекты ресурсов, которые необходимо создать, когда возникает необходимость, и затраты на вычисление КАКОГО типа объекта ресурсов высоки (скажем, длительный запрос к БД). Следовательно, фабрика будет видеть, был ли ей передан старый объект ресурса, и если да, создаст такой же, как он, просто вызвав $ old_object-> new ()
- избегая затрат ресурсов на повторное вычисление вида ресурса.
В качестве другого примера, если у вас есть иерархия классов, обозначающая животных, и фабрика для создания новых животных в симуляции, вы можете вызвать $ newborn = $ factory-> make_new_animal ($ mother)
с заводской реализацией просто $ object-> new ()
Я не вижу реальной пользы. Вы всегда можете просто выполнить ref ($ obj) -> new
или получить метод $ obj-> clone
; таким образом вы не останетесь без сомнения, что из этих двух $ object-> new
делает.
Как говорили другие, это позволяет полиморфно создавать новый экземпляр объекта без необходимости знать тип этого экземпляра.
Что касается клонирования объекта, я обычно пишу явные методы clone () или copy (), которые могут правильно копировать атрибуты и другие данные, но нет причин, по которым new () не может позаботиться об этой роли, если это четко задокументировано. Однако я вижу два преимущества в их раздельном определении: