Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns by D.pdf
Скачиваний:
25
Добавлен:
19.02.2016
Размер:
2.57 Mб
Скачать

Lazy initialization — Ленивая инициализация

Отложенная (ленивая) инициализация (англ. Lazy initialization). Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция «на лету» и логистическая концепция «Точно в срок».

Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило, он используется в сочетании с такими шаблонами как Фабричный метод, Одиночка и Заместитель.Содержание [убрать]

Достоинства

Инициализация выполняется только в тех случаях, когда она действительно необходима;

ускоряется начальная инициализация.

Недостатки

Невозможно явным образом задать порядок инициализации объектов;

возникает задержка при первом обращении к объекту.

Пример реализации

public class LazyInitialization<T> where T : new()

{

protected LazyInitialization() { }

private static T _instance; public static T Instance

{

get

{

if (_instance == null)

{

lock (typeof(T))

{

if (_instance == null) _instance = new T();

}

}

return _instance;

}

}

}

public sealed class BigObject: LazyInitialization<BigObject>

{

public BigObject()

{

//Большая работа

System.Threading.Thread.Sleep(3000); System.Console.WriteLine("Экземпляр BigObject создан");

}

}

class Program

{

static void Main(string[] args)

{

System.Console.WriteLine("Первое обращение к экземпляру BigObject...");

23

//создание объекта происходит только при этом обращении к объекту

System.Console.WriteLine(BigObject.Instance);

System.Console.WriteLine("Второе обращение к экземпляру BigObject...");

System.Console.WriteLine(BigObject.Instance);

//окончание программы

System.Console.ReadLine();

}

}

using System;

public class BigObject

{

private static BigObject instance;

private BigObject()

{

//Большая работа

System.Threading.Thread.Sleep(3000);

Console.WriteLine("Экземпляр BigObject создан");

}

public override string ToString()

{

return "Обращение к BigObject";

}

//Метод возвращает экземпляр BigObject, при этом он

//создаёт его, если тот ещё не существует

public static BigObject GetInstance()

{

//для исключения возможности создания двух объектов

//при многопоточном приложении

if (instance == null)

{

lock (typeof(BigObject))

{

if (instance == null) instance = new BigObject();

}

}

return instance;

}

public static void Main()

{

Console.WriteLine("Первое обращение к экземпляру BigObject...");

//создание объекта происходит только при этом обращении к объекту

Console.WriteLine(BigObject.GetInstance());

Console.WriteLine("Второе обращение к экземпляру BigObject...");

Console.WriteLine(BigObject.GetInstance());

//окончание программы

Console.ReadLine();

}

}

24

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]