Приветствую Вас ГостьСреда, 15.05.2024, 17:26

Программирование на Java, Android, Delphi


Блог

Главная » 2013 » Май » 28 » Шаблоны проектирования. Одиночка
12:51
Шаблоны проектирования. Одиночка
Паттерн проектирования "Одиночка" (Синглетон, singleton) относится к производящим шаблонам, он позволяет создавать единственный объект в системе. Создавать единственный объект в системе (и гарантировать, что будет создан только один экземпляр) иногда просто необходимо: например объекты подключения к базе данных, объекты работающие  с реестрами и так далее. Наличие нескольких объектов в системе может привести к сбоям в работе приложения. Паттерн "Одиночка" помогает решить эту задачу.
Для реализации данного паттерна нам нужно: во-первых, запретить создавать объекты через конструктор, сделав его приватным (так мы гарантируем, что клиентский код не сможет создать объект оператором new()), во-вторых, создать статическую переменную для хранения объекта и статический метод для возврата этого объекта. Теперь запрос объекта будем вести через имя класса и этот статический метод. Пример:
class DataBaseConnection{
//приватная статическая переменная для хранения одиночки
private static DataBaseConnection connection;
//приватный конструктор класса - запрещаем создавать объекты оператором new вне данного класса
private DataBaseConnection(){};
//метод для возвращения единственного объекта в системе
public static DataBaseConnection getInstance(){
if (connection == null){
connection = new DataBaseConnection();
}
return connection;
}

@Override public String toString(){return "Это объект соединения с базой данный в единственном экземпляре в системе \n";}

}


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//клиентский код для использования паттерна одиночки "singleton"

//при первом вызове создается объект (вызывается конструктор объекта)
jTextArea1.append(DataBaseConnection.getInstance().toString());
//при повторных вызовах - возвращается уже созданный объект
jTextArea1.append(DataBaseConnection.getInstance().toString());
jTextArea1.append(DataBaseConnection.getInstance().toString());
jTextArea1.append(DataBaseConnection.getInstance().toString());
jTextArea1.append(DataBaseConnection.getInstance().toString());

}
Казалось бы, все хорошо и данный код гарантирует создание единственного объекта. Проблемы могут начаться, если перенести этот код в многопоточную среду. Для того, чтобы исправить ситуацию нужно сделать метод, возвращающий объект синхронизированным:
class DataBaseConnection{
//приватная статическая переменная для хранения одиночки
private static DataBaseConnection connection;
//приватный конструктор класса - запрещаем создавать объекты оператором new вне данного класса
private DataBaseConnection(){};
//метод для возвращения единственного объекта в системе
synchronized public static DataBaseConnection getInstance(){
if (connection == null){
connection = new DataBaseConnection();
}
return connection;
}

@Override public String toString(){return "Это объект соединения с базой данный в единственном экземпляре в системе \n";}

}
Данный код будет хорошо работать в многопоточной среде, но он немного неэффективный в связи с наличием синхронизированного метода. В идеале синхронизация нужна только при первом вызове, далее она не нужна. Поэтому можно переделать немного этот код, поместив создание объекта в секцию синхронизации, а возврат созданного объекта оставив не синхронизированным.
Категория: Java (Разработка программного обеспечения на Java) | Просмотров: 997 | Добавил: alex | Теги: разработка программ, одиночка, синглетон, паттерны, Java, singleton, шаблоны проектирования | Рейтинг: 5.0/4
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Май 2013  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Архив записей