Skip to content

Instantly share code, notes, and snippets.

@maplemap
Forked from DmitriiNazimov/pattern-flyweight.js
Created July 19, 2020 09:28
Show Gist options
  • Save maplemap/27a030b00dba0d7184a4981f6ebcde79 to your computer and use it in GitHub Desktop.
Save maplemap/27a030b00dba0d7184a4981f6ebcde79 to your computer and use it in GitHub Desktop.
[JS ES6 Паттерн ПРИСПОСОБЛЕНЕЦ/ЛЕГКОВЕС (Flyweight)] #js #ES6 #ООП #Паттерны
/**
*
* ПАТТЕРН ПРИСПОСОБЛЕНЕЦ/ЛЕГКОВЕС (Flyweight)
*
* Паттерн ПРИСПОСОБЛЕНЕЦ/ЛЕГКОВЕС - структурный шаблон проектирования, при котором объект, представляющий себя как
* уникальный экземпляр в разных местах программы, по факту не является таковым.
* Данный паттерн проектирования позволяет вместить большее количество объектов в отведённую оперативную память.
* Легковес экономит память, разделяя общее состояние объектов между собой, вместо хранения одинаковых данных в
* каждом объекте.
* В поездах дальнего следования воду для горячих напитков кипятят в больших емкостях – сразу для всех. Это позволяет
* экономить электричество (или газ).
* Шаблон Приспособленец сводит к минимуму использование памяти или вычислительные расходы, разделяя одни данные между
* множеством подобных объектов.
* Работает примерно как синглтон: помещает все создаваемые обьекты в один массив и следить чтобы значения массива были
* уникальными, не повторялись. Т.е. может быть [1,2,3], но НЕ может быть [1,1,1,2].
*
*/
// flyweight class
class Icecream {
constructor(flavour, price) {
this.flavour = flavour;
this.price = price;
}
}
// factory for flyweight objects
class IcecreamFactory {
constructor() {
this._icecreams = [];
}
createIcecream(flavour, price) {
let icecream = this.getIcecream(flavour);
if (icecream) {
return icecream;
} else {
const newIcecream = new Icecream(flavour, price);
this._icecreams.push(newIcecream);
return newIcecream;
}
}
getIcecream(flavour) {
return this._icecreams.find(icecream => icecream.flavour === flavour);
}
}
// usage
const factory = new IcecreamFactory();
const chocoVanilla = factory.createIcecream('chocolate and vanilla', 15);
const vanillaChoco = factory.createIcecream('chocolate and vanilla', 15);
const strawberry = factory.createIcecream('strawberry', 10);
const chocVan = factory.createIcecream('chocolate and vanilla', 15);
console.log(factory._icecreams);
// reference to the same object
console.log(chocoVanilla === vanillaChoco); // true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment