Шаг 69 - Одиночный(Singleton) паттерн в С#

Для более подробного знакомства с теорией читайте "Шаг 10 - Одиночка. Singleton" и "Шаг 29 - Единственный экземпляр класса - Одиночка или Singleton". Там все описано более подробно. Идея в том что, нам нужно гарантировать, чтобы экземпляр какого-то классы был только в единственном числе, но использовать его могли многие. Например у Вас есть спулер печати. Им могут пользоваться много программ. Что будет, если одновременно будет запущено несколько программ, которые сами по себе начнут печатать, будут они воевать за ресурс. Конечно есть такие понятия как блокировки, но есть и понятие смертельного захвата (см. "Шаг 86 - Что такое смертельный захват(Deadlock) и как с ним бороться"). Кроме того, кому будет приятно ждать когда приложение закончит печать в момент печати другого ? Вообщем ясно. Нужно гарантировать только один экземпляр, даже если пользоваться им будут многие. Смотрим код:

using System;
using System.Collections;


class Printers
{
private static Printers myPrinter;
private static ArrayList al;

private Printers()
{
	al = new ArrayList();  
}

public static Printers GetPrinters()
{
	if (myPrinter==null)
	{
		myPrinter = new Printers();
	}
	return myPrinter;
}

public  void Adds( string s)
{
	al.Add(s);
}

public  void Print()
{
	for (int x=0;x<al.Count;x++) 
	{
		Console.WriteLine(al[x]);
	}
}

}

class MainClass
{
	public static void Main(string[] args)
	{
		Printers pr1=Printers.GetPrinters();
		pr1.Adds("Print 1");
		Printers pr2=Printers.GetPrinters();
		pr2.Adds("Print 2");
		pr1.Print();
		
	}
}

Идея такая. В классе есть внутренний экземпляр класса. Конструктора нет. У нас единственный шанс использовать объект - это вызывать ссылку на него через GetPrinter. Если обращений не было, то класс будет создан, иначе вернется тот же объект. В результате вся работа происходит с одним объектом даже если используются разные переменные так как в переменных ссылка на тот же объект. Смотрите, мы создали две переменным типа Printers. И используя их добавляли строки, но все равно использовался один класс и одна коллекция внутри этого класса. Для проверки вызывается Print.

gif/69_1.gif (1620 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.