Builder

by Artem

JavaScript

'use strict';

const CMS = {
  WORDPRESS: 'Wordpress',
  ALIFRESCO: 'Alifresco'
};

class Website {
  setName(name) {
    this.name = name;
  }
  setCms(cms) {
    this.cms = cms;
  }
  setPrice(price) {
    this.price = price;
  }
}

class VisitCardWebsiteBuilder {
  createWebsite() {
    this.website = new Website();
  }
  buildName() {
    this.website.setName('Visit Card');
  }
  buildCms() {
    this.website.setCms(CMS.WORDPRESS);
  }
  buildPrice() {
    this.website.setPrice(500);
  }
  getWebsite() {
    return this.website;
  }
}

class Director {
  setBuilder(builder) {
    this.builder = builder;
  }
  buildWebsite() {
    this.builder.createWebsite();
    this.builder.buildName();
    this.builder.buildCms();
    this.builder.buildPrice();
    return this.builder.getWebsite()
  }
}

// usage
const director = new Director();
director.setBuilder(new VisitCardWebsiteBuilder());
const website = director.buildWebsite();
console.log(website);