1. используй CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE
2. у кикис заканчивается срок жизни и поэтому они становятся не действительными т.ч. лучше перелогиниваться при каждом сеансе, а потом отправлять остальные запросы с тем же дескриптором $curl
1. ты путаешь/миксуешь фабрику и билдер
2. должен быть определен абстрактный метод AbstactEntityFactory::create()
3. что мешает реализовать Collection::__construct(array $entities)?
4. фабричный метод EntityInterface::fromState() заявлен непосредственно в модели зачем создавать отдельный класс?
этому вопросу посвящена тонна литературы, а ты хочешь чтобы тебе коротенько в 2х словах раскрыли тему.. самый простой вариант - вначале изучи unity/unreal engine и определись с тем, что тебе в них не нравится, потом уже начинай пилить свой движок