Creational Design patterns

this patterns help in creating objects from functions.

by bhupendra negi

HTML

<ul>
  Creational Design Pattern
  <li> Constructor </li>
  <li> Module </li>
  <li> Factory </li>
  <li> Singleton </li>
</ul>

JavaScript

/* Constructpr pattern */
function Task(name) {
  this.name = name;
  this.completed = false;
}

Task.prototype = {
  complete: function() {
    this.completed = true;
  },
  toString: function() {
    console.log("The task is " + this.name + " and its status is :" + this.completed)
  }
}

var task1 = new Task("demo for constructor pattern");
console.log(task1);
task1.toString();
task1.complete();
task1.toString();

/* Module pattern */

var Repo = function() {
  var db = {} // Database configurations available to get and set methods via closures 
  return {
    get: function(id) {
      console.log("Getting data" + id);
      return ("task " + id + " fetched")
    },
    save: function(id) {
      console.log("Saving data " + id)
    }
  }
}

var op1 = new Task(Repo().get(1));
console.log(op1);

/* Factory pattern */
var repoFactory = function() {
    var repos = this;
    var repoList = [{
      name: 'task',
      source: './taskrepo'
    }, {
      name: 'project',
      source: './projectrepo'
    }]

    repoList.forEach(function(repo) {
      repos[repo.name] = require(repo.source);
    });
  }
  // module.exports = new repofactory ;
  // var repo = repoFactory.task.get(1)

/* Singleton */
var TaskRepo = ( function(){
  var taskRepo;
  function createRepo()  {
    taskrepo = new Object("new task");
    return taskRepo;
  }

  return {
    getInstance: function() {
      if (!taskRepo) {
        taskRepo = createRepo();
      }
      return taskRepo;

    }
  }

})();

var taskrepo1 = TaskRepo.getInstance();
var taskrepo2 = TaskRepo.getInstance();
console.log(taskrepo1 === taskrepo2)