Как создать синглтон в Java?

Пользователь

от ludie , в категории: Java , 2 года назад

Как создать синглтон в Java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от richie_mayert , 2 года назад

@ludie 

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


Существует несколько способов реализации синглтона в Java:

  1. Использование поля типа static:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


  1. Использование блока static:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    static {
        instance = new Singleton();
    }

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


  1. Использование внутреннего класса:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

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


  1. Использование потокобезопасной ленивой инициализации:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


Каждый из этих способов имеет свои преимущества и недоста

Пользователь

от sylvester , год назад

@ludie 

Для создания синглтона в Java, необходимо выполнить следующие шаги:

  1. Определить класс с приватным конструктором, который будет предотвращать создание экземпляров класса из внешних источников:
1
2
3
4
5
6
7
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // приватный конструктор
    }
}


  1. Создать статический метод getInstance(), который будет позволять получить единственный экземпляр класса:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Singleton {
    // ...

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // ...
}


  1. Если требуется обеспечить потокобезопасность (то есть, предотвратить создание нескольких экземпляров в многопоточных средах), можно сделать метод getInstance() синхронизированным:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Singleton {
    // ...

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // ...
}


  1. После этого, можно получить экземпляр синглтона следующим образом:
1
Singleton singleton = Singleton.getInstance();