Patron de diseño Singleton - ECMAScript 6

Una parte fundamenta del desarrollo es el entendimiento de los patrones de diseño y como podemos aplicarlos en nuestros desarrollos, pueden variar según la necedad o los requerimientos lo establezcan, navegando encontré este excelente libro Learning JavaScript Design Patterns por Addy Osmani donde explican los diferentes patrones que existen y como estructurarlos en javascript, lo que note es que los ejemplos del libro se basan en ECMAScript 5, así que como ejercicio voy a mostrarles una comparativa del patrón de diseño Singleton echo con ECMAScript 5 implementando ECMAScript 6

ECMAScript 5

'use strict'

var Carro = (function(){  
  var _instance; 
  var _modelo; 
  var _velocidad =  Math.round((Math.random()*150));

  function getModelo(){
    return _modelo;
  } 

  function setModelo(newModelo){
    _modelo = newModelo;

  }

  function getVelocidad(){
    return _velocidad;
  }

  function init(){
    return {
      getModelo:getModelo,
      setModelo:setModelo,
      getVelocidad:getVelocidad
    }
  }

  return {

    getInstance:function(){
      if(!_instance){
        _instance = init();
      }

      return _instance;

    }
  }

})();

Probar el anterior código

var toyota = Carro.getInstance();

toyota.setModelo('toyota');  
console.log("Modelo del carro es : "+ toyota.getModelo());  
console.log("Velocidad del carro : "+ toyota.getVelocidad());  
console.log("----------");

var honda = Carro.getInstance();

toyota.setModelo('honda');  
console.log("Modelo del carro es : "+ toyota.getModelo());  
console.log("Velocidad del carro : "+ toyota.getVelocidad());  
console.log("----------");  
console.log("Modelo del carro es : "+ toyota.getModelo());  
console.log("Velocidad del carro : "+ toyota.getVelocidad());

ECMAScript 6

'use strict';

class Carro {

  constructor(){
    this._instance; 
    this._modelo;
    this._velocidad = Math.round((Math.random()*150));
  }

  get modelo(){
    return this._modelo;
  }

  set modelo(newModelo){
    this._modelo = newModelo;
  }

  get velocidad(){
    return this._velocidad;
  }

  static  getInstance(modelo){
    if(!this._instance){
       return this._instance = new Carro(modelo);
    }
    return this._instance;
  }
}

Probar el código anterior

let toyota = Carro.getInstance();  
toyota.modelo="toyota";  
console.log(` Modelo del carro es : ${ toyota.modelo } `);  
console.log(` Velocidad del carro : ${toyota.velocidad } `);  
console.log("----------")  
let honda = Carro.getInstance();  
honda.modelo="honda";  
console.log(` Modelo del carro es : ${ honda.modelo } `);  
console.log(` Velocidad del carro : ${honda.velocidad } `);  
console.log("----------")  
console.log(` Modelo del carro es : ${ toyota.modelo } `);  
console.log(` Velocidad del carro : ${toyota.velocidad } `);

Lo fundamental en este patrón es crear una sola instancia del objeto y utilizarla a lo largo del proyecto, como podemos ver en los ejemplos la velocidad del carro es la misma en los diferentes objetos creados, este patrón es útil para persistir objetos que realicen conexión a una base de datos