Object creation directly via `new Class(...)` where the construction logic needs validation, subclass selection, or instance caching but the constructor can't express any of it.
Object creation goes through a named function that can validate, choose subclasses, or return cached instances.
Before the refactoring
const employee = new Employee(name, 'engineer', salary);
After the refactoring
function createEngineer(name, salary) {return new Employee(name, 'engineer', salary);}const employee = createEngineer(name, salary);
Constructors can't validate, return subclasses, or cache; consumers either accept the limitation or scatter pre-construction logic at every call site.
Hides the actual class from callers — the factory's name must still express the produced shape clearly.
Construction can vary per case; consumers don't depend on which concrete class they're getting.
Wrapping every constructor in a factory function for principle — adds a layer of indirection without buying validation, polymorphism, or caching capability.