пятница, 12 февраля 2010 г.

Одиночка или синглетон

Как я и обещал, мы будем публиковать повести о разных шаблонных решениях.
Во многих языках программирования существует механизм глобальных переменных, помимо области размещения в памяти, они обладают свойством всеобщей доступности – в Java таких переменных нет. Зачем это может понадобиться нам, крутым проектировщикам, ведь глобальные переменные – зло? – А я хочу параметры настройки один раз читать из файла и потом их отовсюду использовать.

Следующая ситуация – иногда хочется иметь гарантию того, что будет создан только один экземпляр класса. Например, я кеширую данные или управляю соединением с БД.
Как решить эти проблемы – на помощь приходит шаблонное решение, который мы и обсудим.

Singleton – класс не имеющий доступного конструктора и создающийся путем вызова статического метода.
Реализация приписываемая Майерсу:

class God {
private static God ourInstance;
private God(){}
public static God getInstance(){
if(ourInstance == null){
ourInstance = new God();
}
return ourInstance;
}
}

Для сокращения количества строк (на 3 штуки – 30%!) и просветления можно использовать строку

return ourInstance == null ? ourInstance = new God() : ourInstance;

"Создавать" объект теперь надо так:
God foo = God.getInstance();

Стоит отметить что злоупотреблять таким решением не стоит, но учить надо.

Совсем забыл - существует альтернативное, простое, но менее гибкое решение. Жду предложения)

3 комментария:

  1. Альтернативное решение - использование static методов.

    (Все почему-то стараются высказывать предположения в личных сообщениях)

    ОтветитьУдалить
  2. альтернативная решения есть вот оно, а воше оно есть и на wiki
    там есть ишю один пример но я использую этот пример

    public class Singleton {
    protected Singleton() {}

    private static class SingletonHolder {
    public static Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
    return SingletonHolder.instance;
    }
    }

    ОтветитьУдалить
  3. во втором решение больше не исполизуется if оператор eто улутшает performance VM машине;

    ОтветитьУдалить