В каких ситуациях используется шаблон фабрика в Javascript?
Вот три основных способа использования фабрик в JavaScript:Фабрика объектов// Объявление фабрики объектов
function Idiot(name) {
  return { name: name };
}
// создание экземпляра объекта
var idiot1 = Idiot('Bill');
console.dir(idiot1);Фабрика классов// Объявление фабрики классов
function PhilosophySchool(schoolName) {
  return function Philosopher(name) {
    return { name: name, school: schoolName };
  };
}

// Создание класса
var Stoicism = PhilosophySchool('Stoicism');
var philosopher = Stoicism('Marcus Aurelius');
console.dir(philosopher);Фабрика прототипов// Объявление базового прототипа
function Engineer(specialization) {
  this.specialization = 'Software';
};

Engineer.prototype.getName = function() {
  return this.specialization + ' engineer ' + this.name; 
}

// Объявление фабрики
function University(specialization) {
  function factoryConstructor(name) {
    this.name = name;
  };
  factoryConstructor.prototype = new Engineer(specialization);
  return factoryConstructor;
}

// Создание конструктора инженеров-программистов
SoftwareEngineer = University('Software');

// Создание экземпляра инженера-программиста
var alex = new SoftwareEngineer('Alex');
console.dir(alex.getName());
На самом деле шаблон фабрика, не путать с абстрактной фабрикой и сейчас не помню но есть и ещё какая-то, используется повсеместно и является очень хорошим примером ооп. Её суть в том чтобы сделать жизнь получателя наиболее комфортной. Ниже самый простой пример, в котором от показывается как на фабрике собирается кнопка о которой получатель знает лишь то, что она прибавляет карму. Если я сделаю таких кнопок очень много, а потом решу поменять её скин, то мне не придется бегать по коду и изменять её отовсюду, а нужно будет сменить лишь сборку на фабрике.var ButtonFactory = (function(){
  function ButtonFactory(){
    
  }
  
  ButtonFactory().prototype.getLikeButton = function(){
    	var likeButton = document.createElement('button');
    	likeButton.style.background = 'ff00ff';
    	likeButton.style.innerHTML = 'like';

        return likeButton;
  };
  
  return ButtonFactory;
})();

var buttonFactory = new ButtonFactory();

document.getElementsByTagName('body')[0].appendChild(buttonFactory.getLikeButton());