Symptom

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.

Goal

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);
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

Constructors can't validate, return subclasses, or cache; consumers either accept the limitation or scatter pre-construction logic at every call site.

Tradeoff

Hides the actual class from callers — the factory's name must still express the produced shape clearly.

Relief

Construction can vary per case; consumers don't depend on which concrete class they're getting.

Trap

Wrapping every constructor in a factory function for principle — adds a layer of indirection without buying validation, polymorphism, or caching capability.