Шаблон Singleton — популярный шаблон проектирования в объектно-ориентированном программировании. Но что это значит и почему это полезно? В этом сообщении блога мы разберем концепцию и предоставим простые примеры из реальной жизни, которые помогут вам понять шаблон Singleton.

Что такое шаблон синглтона?

Проще говоря, шаблон Singleton ограничивает создание экземпляра класса одним объектом. Он часто используется, когда наличие нескольких экземпляров класса может вызвать проблемы, такие как управление общими ресурсами, координация доступа к централизованной базе данных или контроль доступа к аппаратным устройствам.

Как реализовать шаблон Singleton

Чтобы реализовать шаблон Singleton в JavaScript, вы обычно определяете класс с закрытым конструктором и статическим методом, который возвращает единственный экземпляр класса. Статический метод проверяет, существует ли уже экземпляр класса; если это так, он возвращает этот экземпляр. Если нет, он создает новый экземпляр и возвращает его.

class Singleton {
  static instance = null;

  static getInstance() {
    if (!Singleton.instance) {
      Singleton.instance = new Singleton();
    }

    return Singleton.instance;
  }

  constructor() {
    if (Singleton.instance) {
      throw new Error("This class is a Singleton!");
    }

    // Initialize the class properties here
  }
}

Давайте рассмотрим несколько примеров для лучшего понимания

Пример 1: очередь печати

В офисе обычно есть общий принтер, которым должны пользоваться несколько сотрудников. Чтобы управлять запросами на печать и избегать конфликтов, вы можете использовать шаблон Singleton для создания одной очереди принтера.

class PrinterQueue {
  static instance = null;

  static getInstance() {
    if (!PrinterQueue.instance) {
      PrinterQueue.instance = new PrinterQueue();
    }

    return PrinterQueue.instance;
  }

  constructor() {
    if (PrinterQueue.instance) {
      throw new Error("This class is a Singleton!");
    }

    this.queue = [];
  }

  addToQueue(document) {
    this.queue.push(document);
    console.log(`${document} added to the printer queue.`);
  }

  printNext() {
    const document = this.queue.shift();
    console.log(`Printing ${document}`);
  }
}

const printerQueue = PrinterQueue.getInstance();
printerQueue.addToQueue("Report.pdf");
printerQueue.addToQueue("Invoice.docx");
printerQueue.printNext();

Пример 2: Система медицинской документации

Предположим, есть больница, в которой используется цифровая система медицинской документации. Система отвечает за управление записями всех пациентов, гарантируя, что каждый пациент имеет уникальную медицинскую карту. Шаблон Singleton можно использовать для создания единой системы медицинских записей, которая управляет всеми записями.

class MedicalRecordSystem {
  static instance = null;

  static getInstance() {
    if (!MedicalRecordSystem.instance) {
      MedicalRecordSystem.instance = new MedicalRecordSystem();
    }

    return MedicalRecordSystem.instance;
  }

  constructor() {
    if (MedicalRecordSystem.instance) {
      throw new Error("This class is a Singleton!");
    }

    this.records = new Map(); // Store patient records using a Map
  }

  addRecord(patientId, record) {
    if (!this.records.has(patientId)) {
      console.log(`Adding new record for patient ${patientId}`);
      this.records.set(patientId, record);
    } else {
      console.log(`Updating existing record for patient ${patientId}`);
      this.records.set(patientId, { ...this.records.get(patientId), ...record });
    }
  }

  getRecord(patientId) {
    if (this.records.has(patientId)) {
      console.log(`Fetching record for patient ${patientId}`);
      return this.records.get(patientId);
    } else {
      console.log(`No record found for patient ${patientId}`);
      return null;
    }
  }
}

const medicalRecordSystem = MedicalRecordSystem.getInstance();
medicalRecordSystem.addRecord('123', { name: 'John Doe', age: 30, bloodType: 'A+' });
const patientRecord = medicalRecordSystem.getRecord('123');

Помните, что когда вам нужно убедиться, что в вашей программе существует только один экземпляр класса, шаблон Singleton может быть полезным решением.

Последние мысли

Шаблон проектирования Singleton — это мощный способ управления ограниченными ресурсами и обмена данными между различными частями вашей программы. Понимая этот шаблон и распознавая, когда его целесообразно использовать, вы можете создавать более эффективное и надежное программное обеспечение.

Как инженер-программист, ваша работа заключается не только в написании кода, но и в проектировании против плохих практик и предотвращении проблем. Продолжайте учиться и совершенствоваться и не стесняйтесь обращаться за помощью.