@alpha917

Что это за шаблон проектирования и насколько он удачен?

В некоторых приложениях использовал подход, в котором фабрика возвращала объекты определенного класса по id. притом возвращала не сам объект а ссылку на него. Сам объект хранится в массиве в фабрике. Притом при всех запросах к фабрике по некоторому id возвращался всегда именно тот единственный экземпляр класса, которых хранил данные для этого id.

Тем самым я достигал того что во всем приложении всегда актуальная информация в этом экземпляре т.к. имеется только один экземпляр и все ссылаются только на него.

Так же в такой класс я добавлял методы для работы и изменения объекта.

Что это за шаблон проектирования? Вроде как синглтон а вроде и нет.
Как по вашему, он удачен? В моем случае он показал себя хорошо, однако я мог просто не попасть на какие-то проблемные места, что думаете?

На JS это выглядит примерно так:
/// некоторый объект, который и будет предоставлять фабрика
class Obj { 
  constructor(id) {
    this.id = id;
    this.value = 0;
  }
}
/// Фабрика
class Factory { 
  constructor () {
    this.objects = {};
  }
  getById(id) {
    if (id in this.objects)
      return this.objects[id];
    this.objects[id] = this.load(id);
    return this.objects[id];
  }
  load(id) {
    let obj = new Obj(id);
    /* получение данных объекта */
    return obj;
  }
}
let factory = new Factory(); // инициализируем фабрику, она должна быть синглтоном

// использование
let a = factory.getById(123);
console.log(a.value); // 0
let b = factry.getById(123);
console.log(b.value); // 0
b.value = 10;
console.log(a.value); // 10
console.log(b.value); // 10
  • Вопрос задан
  • 382 просмотра
Решения вопроса 1
qonand
@qonand
Software Engineer
Что это за шаблон проектирования? Вроде как синглтон а вроде и нет.

FlyweightFactory
Как по вашему, он удачен? В моем случае он показал себя хорошо, однако я мог просто не попасть на какие-то проблемные места, что думаете?

Сложно судить т.к. удачное использование шаблона зависит только от задачи к которой он применяется. Если Ваши объекты особо не имеют состояний, тогда данный паттерн вполне уместно применить, если же Ваши объекты это сущности - тогда стоит применить паттерн Identity Map
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks
Ссылки на то и называются ссылками, что всегда хранят актуальную информацию. С таким же успехом, можно было бы написать window.objects или var objects.
Я бы даже сделал так:
var storage={add:(key,value)=>{if(typeof(storage[key]) ==='undefined')storage[key]=value;}}
storage.add(123,{value:0});

// использование
let a = storage[123];
console.log(a.value); // 0
let b = storage[123];
console.log(b.value); // 0
b.value = 10;
console.log(a.value); // 10
console.log(b.value); // 10
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы