Преимущества второго над первым три.
1. Разделение ответственности: класс отвечает за организацию памяти, а сериализатор — за сохранение-запись.
2. Продуманный наружный интерфейс: сложно сделать «класс в себе», который позволяет тянуть данные из JSON, но такую же функциональность для XML сделать уже невозможно. Как вы понимаете, программист всегда лавирует между трёх огней: одна крайность — позволить программисту «напортачить» и сделать так, чтобы song.records[] и record.tracks[] были не согласованы. Вторая — сделать «класс в себе», где шаг влево, шаг вправо — шаблон «Public Морозов». Третья — не обеспечить производительность: без record.tracks[] никуды, а вот без song.records[] можно и пожить, но как искать в коллекции пластинок нужную песню — ХЗ.
3. Когда, помимо песен, на пластинках могут быть лекции и танцы, но мы коллекционируем Битлов, мы не обязаны тащить в EXE-файл то, на что не подписывались. Или большинство текстовых форматов сериализации тяжелы — в Питоне-то они сидят прямо в библиотеке и на это забить, она всегда есть, а вот в Си++ обычно где-то в EXE-файле.
Главный недостаток второго над первым: когда, помимо песен, на пластинках могут быть лекции и танцы, виртуальный полиморфизм проще и ошибкобезопаснее.
И ещё: это НЕ фабрика классов. Фабрика классов начинается, когда…
1. Эту штуку нужно ДЕсериализовать.
2. И не просто десериализовать, а на пластинках могут быть песни, лекции, танцы — например, при тэге «song» мы делаем песню, при тэге «lecture» лекцию…