Ну, в любой функции, которая объявляется так
function Foo(a, b, c) {...}
внутри спрятан конструктор (который по умолчанию даже называется так же). Поэтому на её основе можно создать "экземпляр" методом new с передачей параметров
var f = new Foo(1, 2, 3);
Для особо впечатлительных любителей "стандартного ООП" в 2015 году даже придумали синтаксис:
class Foo {
constructor(a, b, c) {
...
}
}
хотя это одно и тоже.
Поскольку в javascript "не настоящее ООП", то конструктор в функции только один, нет "перегрузки методов", и при её написании надо - внутри - предусмотреть разные варианты количества передаваемых параметров при создании "экземпляра". На выходе (после объявления объекта посредством new) получается сразу готовый объект с переданными - во время объявления - параметрами. В "настоящем ООП" это дело решается с помощью написания нескольких конструкторов с разным количеством агрументов, ну а тут он - один (с переменным числом аргументов).
И чтоб не париться с разбором внутри, можно написать "основную" функцию совсем без аргументов, а потом приписать "добавочные" методы с разными вариантами числа аргументов-параметров ЗА ПРЕДЕЛАМИ функции-конструктора.
Foo.showHimself = function(arguments) { ... }
Они и есть "фабричные".