Как использовать шаблон синглтона для создания порядкового номера в Java

1

У меня есть класс Orders, и мне нужно иметь шаблон singleton, чтобы иметь возможность создавать порядковый номер для каждого обработанного заказа. Как это реализовать?

Мой класс заказа имеет Order_ID, Customer_ID, Order_desc и Ordered_qty. Необходимо создать порядковый номер для каждого заказа, обработанного с использованием шаблона singleton.

  • 2
    Это не похоже на хорошее использование шаблона синглтона . Зачем вам нужно генерировать последовательность за пределами базы данных?
  • 0
    Это домашнее задание или задание?
Показать ещё 4 комментария
Теги:
singleton

3 ответа

3
Лучший ответ

Это может быть одна из тех проблем X/Y, где вы думаете, что Y - это решение для X, поэтому вы обращаетесь за помощью к Y, но, возможно, есть лучшее решение.

Строго говоря, для реализации singleton вам нужен только класс, чьи только конструкторы являются частными, статическая ссылка на экземпляр класса как поля класса и общедоступный метод getInstance. Затем создайте метод экземпляра, который возвращает следующий номер в строке.

public class MySingleton {
    private static MySingleton instance = new MySingleton();

    private volatile int next = 0;

    private MySingleton() {
        // prevent external instantiation of a singleton.
    }

    public static MySingleton getInstance() {
        return instance;
    }

    public synchronized int getNextSequence() {
        return next++;
    }
}

Есть много недостатков с этим решением вашей проблемы, некоторые из них - просто базовый дизайн ООП, а некоторые более системные:

  1. Синглтон, который не реализует или не расширяет любые типы, бесполезен. Вместо этого вы можете использовать все статические методы. Синглтоны полезны, если вы пишете класс, который реализует интерфейс, и этот интерфейс используется кем-то другим, но вам нужен только один экземпляр в качестве детали реализации. Этот тип singleton является попыткой сделать глобальную переменную похожим, что это не глобальная переменная.
  2. Это не сохранится при перезагрузке приложений. Если эти последовательности используются для идентификации данных, которые хранятся извне или совместно, вы в конечном итоге повторяете одни и те же номера при перезапуске приложения.
  3. Если вы развертываете несколько экземпляров приложения, которые читают и записывают в общую постоянную память, например базу данных, они будут повторно использовать одни и те же номера, потому что последовательность отслеживается только в JVM.
  4. Базы данных в этом случае исключительно хороши. Попытка заново изобрести его в уровне приложения кажется... неуместным.
  • 1
    метод getInstance должен быть статическим.
  • 0
    Метод @OldCurmudgeon синхронизирован
Показать ещё 6 комментариев
0

Ключевым аспектом является использование одного AtomicLong в качестве одноэлементного. Вы можете моделировать его следующим образом:

class Orders {

    private static final AtomicLong NEXT_ID = new AtomicLong();

    static Order newOrder(Customer customer, String description, int quantity) {
        return new Order(orderId(), customer, description, quantity);
    }

    private static long orderId() {
        return NEXT_ID.incrementAndGet();
    }
}

class Order {

    private final long orderId;
    private final long customerId;
    private final String description;
    private final int quantity;

    Order(long orderId, Customer customer, String description, int quantity) {
        this.orderId = orderId;
        this.quantity = quantity;
        this.customerId = customer.getCustomerId();
        this.description = description;
    }

}

class Customer {

    public long getCustomerId() {
        throw new UnsupportedOperationException("not yet implemented");
    }
}
0

Хотя я согласен с @Elliott Frisch, что сам вопрос звучит странно. Однако, если вам действительно нужно генерировать идентификаторы самостоятельно, вот прототип, который реализует классическую версию шаблона Singleton.

public class IdGenerator {
    private  static IdGenerator instance;
    private int id = 0;
    private IdGenerator(){}
    private static IdGenerator getInstance() {
        synchronized(IdGenerator.class) {
           if (instance == null) {
                instance = new IdGenerator();
           }
           return instance;
        }
    }

    public int nextId() {
        return id++;
    }
}

Обратите внимание, что слово "классический". Существует много возможных улучшений шаблона Singleton, и есть сотни статей, которые объясняют их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню