This is a pretty good demonstration of the pattern. I will say that in practice, I would prefer to simply use bare object syntax over the use of new with constructor functions. When I do use constructors, I'd now prefer the class syntax.
class Employee {
constructor(type, name) {
this.type = type;
this.name = name;
}
}
class Developer extends Employee {
constructor(name) {
base("Developer", name);
}
}
class Tester extends Employee {
constructor(name) {
base("Developer", name);
}
}
class EmployeeFactory {
static types = [
Developer,
Tester,
}
create(type, name, ...options) {
const TypedEmployee = EmployeeFactory.types[type];
return TypedEmployee && new TypedEmployee(name, ...options);
}
}
I did put type before name above, as imho it should be first as this will work better with a spread operator.