Главная мысль
Factory создаёт объекты, не заставляя вызывающий код знать точный класс/форму. Инкапсулирует логику создания — особенно если она сложная или тип выбирается в рантайме.
function createAnimal (type ) {
if (type === "dog" ) return { sound : "woof" };
if (type === "cat" ) return { sound : "meow" };
throw new Error (`Unknown animal: ${type} ` );
}
const dog = createAnimal ("dog" );
const cat = createAnimal ("cat" );
Зачем на практике
Единое место валидации/defaults.
Подмена реализаций (dev/prod, feature flags).
Меньше new ConcreteX по всему коду.
Не усложняй: если всегда один тип с простой конструкцией — обычный конструктор/функция достаточны.
Итог: factory прячет «как создать»; вызывающий код говорит «что нужно».