Одним из самых распространенных и востребованных шаблонов является данный паттерн.
Singleton всегда один и тот же, в любом месте программы. В этом можно легко убедиться - воспользоваться сверкой хэша созданного объекта.
public class SimpleSingleton(){
//сущность
private static SimpleSingleton simpleSingleton;
//конструктор
private SimpleSingleton();
//инициализация
public static SimpleSingleton getInstance(){
if (simpleSingleton==null){
simpleSingleton = new SimpleSingleton();
}
return simpleSingleton;
}
}
Хоть в реализации и использован приватный конструктор, это никак не означает, что нельзя создать вторую сущность, отличную от первой(создается с помощью изменения конструктора). Для предотвращения такого поведения можно добавить в конструтор эксепш.
private SimpleSingleton(){
if(simpleSingleton != null)
throw new RuntimeException("Для получения Синглтона воспользуйтесь методом getInstance().");
}
Для получения потоко-независимого синглтона в объявление метода getInstance() нужно добавить ключевое слово synchronized. В этом случае поток выполнения будет всегда дожидаться окончания работы с объектом. И второй поток не сможет получить управление Singleton'ом. Самый существенный минус такого подхода - медленная производительность.
public synchronized static SimpleSingleton getInstance(){
if (simpleSingleton==null){
simpleSingleton = new SimpleSingleton();
}
return simpleSingleton;
}
Аналогичный смысл представляет шаблон Registry (реестр) и Multiton(коллекция синглтонов).
Singleton всегда один и тот же, в любом месте программы. В этом можно легко убедиться - воспользоваться сверкой хэша созданного объекта.
public class SimpleSingleton(){
//сущность
private static SimpleSingleton simpleSingleton;
//конструктор
private SimpleSingleton();
//инициализация
public static SimpleSingleton getInstance(){
if (simpleSingleton==null){
simpleSingleton = new SimpleSingleton();
}
return simpleSingleton;
}
}
Хоть в реализации и использован приватный конструктор, это никак не означает, что нельзя создать вторую сущность, отличную от первой(создается с помощью изменения конструктора). Для предотвращения такого поведения можно добавить в конструтор эксепш.
private SimpleSingleton(){
if(simpleSingleton != null)
throw new RuntimeException("Для получения Синглтона воспользуйтесь методом getInstance().");
}
Для получения потоко-независимого синглтона в объявление метода getInstance() нужно добавить ключевое слово synchronized. В этом случае поток выполнения будет всегда дожидаться окончания работы с объектом. И второй поток не сможет получить управление Singleton'ом. Самый существенный минус такого подхода - медленная производительность.
public synchronized static SimpleSingleton getInstance(){
if (simpleSingleton==null){
simpleSingleton = new SimpleSingleton();
}
return simpleSingleton;
}
Аналогичный смысл представляет шаблон Registry (реестр) и Multiton(коллекция синглтонов).
No comments:
Post a Comment