Мне было интересно, если это шаблон проектирования или это хорошая практика программирования?
Да, это вариант фабричного шаблона .
По сути, он позволяет вам иметь один метод, который в зависимости от аргументов этого метода будет отправлять динамическое создание правильного типа производного объекта.Это позволяет вам использовать ту же «фабричную» функцию в вашем коде, и если есть какие-либо изменения или дополнения в базовых объектах, которые создает фабричный метод, вам не нужно изменять код, который фактически вызывает вашу «фабричную» функцию,Таким образом, это форма инкапсуляции, которая изолирует любые изменения для создания объекта от сегмента кода, который находится за «фабрикой», а не от кода, вызывающего «фабрику».Например, используя фабрику, довольно просто добавить новые типы, которые может создать фабричный метод, но ни один из предыдущих кодов, выполняющих вызов фабрики, не должен изменяться.Вам просто нужно создать новый производный класс для нового объекта, который вы хотите создать, и для любого нового кода, который желает этот новый объект, вы передаете правильные новые аргументы.Все старые аргументы по-прежнему работают, и в коде не нужно вносить изменений в отношении возвращаемых типов указателей и т. Д.
Причина использования смарт-указателей с фабрикой состоит в том, чтобы избежать памятиутечки, которые могут возникнуть, когда владение указателем неоднозначно.Например, фабрика должна возвращать указатель, так как она создаёт объект в двухстороннем порядке.Тогда возникает вопрос, кто очищает указатель, чтобы избежать либо свисающих указателей, либо утечек памяти?Интеллектуальные указатели устраняют эту проблему владения и гарантируют, что память не будет случайно очищена, когда другие объекты все еще указывают на эту память, или что память не просто теряется, поскольку последний указатель на эту область памяти выходит из области видимости безdelete
призвал его.