Шаблон синглтон — класс сам по себе

Так называемые паттерны проектирования помогают разработчикам в объектно-ориентированном программировании, предоставляя проверенные и испытанные шаблоны для решения задач программирования. После того, как из примерно семидесяти шаблонов проектирования найден наиболее подходящий, он дорабатывается путем внесения индивидуальных изменений. Однако общий подход к шаблону остается неизменным. Шаблон проектирования singleton является очень мощным, но имеет репутацию пережитка в объектно-ориентированном программировании. В нашем руководстве мы познакомим вас с его сильными и слабыми сторонами, а также покажем, как он используется в программировании.

Что такое паттерн синглтон?

Паттерн синглтон относится к категории креативных паттернов в области паттернов проектирования. Менее часто используемое название — просто «синглтон». Его цель — предотвратить создание более одного объекта в классе. Это достигается путем создания нужного объекта в классе и получения его как статического экземпляра. Синглтон является одним из самых простых, но наиболее мощных паттернов в разработке программного обеспечения.

Цитата

Gang of Four» (GoF) — команда программистов из США — так говорит о паттерне «синглтон»: «Убедитесь, что класс имеет ровно одну копию, и обеспечьте глобальную точку доступа к ней».

Каковы характеристики паттерна singleton?

Если паттерн проектирования singleton был использован для создания экземпляра класса, то паттерн гарантирует, что он действительно останется только с этим единственным экземпляром. Синглтон делает этот класс глобально доступным. В разных языках программирования существуют разные методы достижения этой цели. Для того чтобы убедиться в том, что он остается только с одним уникальным экземпляром, необходимо запретить пользователям создавать новые экземпляры. Это достигается тем, что в конструкторе шаблон объявляется как «частный». Это означает, что только код синглтона может инстанцировать сам синглтон. По сути, это гарантирует, что только один и тот же объект может попасть к пользователю. Если такой объект уже существует, новый экземпляр не создается. Возможный синглтон выглядит следующим образом:

public class Singleton {
	private static Singleton instance; // protected from external access and static
	private Singleton() {} // private constructor with external access protection
	public static Singleton getInstance() { // public method, call out by code
		if (instance == null) { // only if no instance exists, then create a new
			instance = new Singleton();
		}
		return instance;
	}
}

Модель синглтона в представлении UML

На приведенной ниже диаграмме с использованием UML весь шаблон проектирования singleton состоит из одного объекта, поскольку необходимо создать только один экземпляр класса.

Снаружи невозможно изменить какую-либо часть созданного уникального экземпляра. Именно это является целью при использовании паттерна проектирования синглтон.

Преимущества и недостатки шаблона проектирования синглтон

Обзор преимуществ

Синглтон можно написать быстро и легко, поскольку он не заполнен бесчисленными (глобальными) переменными. Он инкапсулирует свое создание, что означает возможность точного контроля над тем, когда и как к нему обращаются. Существующий шаблон синглтона может быть развит с помощью подклассов для наполнения новыми функциональными возможностями. Решение о том, какой из них будет использоваться, принимается динамически. И последнее, но не менее важное: синглтон создается именно тогда, когда он необходим — эта характеристика называется ленивой загрузкой. Процесс инстанцирования синглтона раньше — до того, как он понадобится, — с другой стороны, называется нетерпеливой загрузкой.

Обзор недостатков

Беспрепятственное использование синглтонов приводит к состоянию, аналогичному состоянию процедурного программирования (т.е. необъектно-ориентированного), и может привести к нечистому программному коду. Глобальная доступность паттернов проектирования синглтонов создает риск при работе с конфиденциальными данными. Если в синглтон вносятся изменения, вы не сможете отследить, какие части программы затронуты. Это затрудняет сопровождение программного обеспечения, поскольку неполадки трудно отследить. Глобальная доступность паттерна также затрудняет удаление синглтонов, поскольку программные компоненты всегда могут ссылаться на этот синглтон. В приложениях с большим количеством пользователей (многопользовательские приложения) синглтон может снизить производительность программы, так как он представляет собой узкое место для данных, будучи единственным.

Шаблон проектирования синглтон «в реальной жизни»

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

Поскольку протестировать паттерн singleton очень сложно, мы проиллюстрируем его работу на примере небольшой компании, в которой несколько сотрудников используют один принтер. Пример, близкий к практике, представлен в серии учебников по паттернам проектирования Дэниела Х. Якобсена. Следующий паттерн проектирования singleton основан на нем.

Если пользователь посылает запрос к принтеру, синглтон задает «вопрос»: «Существует ли уже объект принтера? Если нет, то создайте его». Это решается с помощью оператора if/then (return printer == zero ?). Чтобы предотвратить доступ и изменения, отдельные переменные и принтер устанавливаются на «private», а не на «public».

public class printer {
	private static printer;
	private int NumberPages;
	private printer() {
	}
	public static printer getInstance() {
		return printer == Null ? 
				printer = new printer() : 
				printer;
	}
	public void print(String text){
		System.out.println(text +
				"n" + "number of pages printed today" + ++ NumberPages +
				"n" + "---------");
	}
}

Следующим шагом является «инкапсуляция» сотрудников филиала. Строки для имен, должности и роли в компании также устанавливаются на «private».

public class Employee {
	private final String name;
	private final String position;
	private final String role;
	public employee(String name, String position, String role) {
		this.name = name;
		this.position = position;
		this.role = role;
	}
	public void printCurrent role (){
		printer = printer.getInstance();
		printer.print("employee: " + name + "n" +
			"Position: " + position + "n" +
			"Role: " + role + "n");
	}
}

Наконец, эти два синглтона объединяются в процедуру вывода.

public class Main {
	public static void main(String[] args) {
		Employee andreas = new employee ("Andreas",
				"Boss",
				"Manages the branch office");
		Employee julia = new employee ("Julia",
				"Consultant",
				"Advises customers on complaints");
		Employee tom = new employee ("Tom",
				"Selling",
				"Sells the products");
		Employee stefanie = new employee ("Stefanie",
				"Developer",
				"IT maintenance in the branch office.");
		Employee matthias = new employee ("Matthias",
				"Accountant",
				"Financial accounting of the branch office.");
		andreas.printCurrentRole();
		julia.printCurrentRole ();
		tom.printCurrentRole ();
		stefanie.printCurrentRole ();
		matthias.printCurrentRole ();
	}
}

Оцените статью
cdelat.ru
Добавить комментарий