Отложенная инициализация (шаблон проектирования)
Отложенная (ленивая) инициализация (англ. {{{Expansion depth limit exceeded}}}). Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция «на лету» и логистическая концепция «Точно в срок».
Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило, он используется в сочетании с такими шаблонами как Фабричный метод, Одиночка и Заместитель.
Достоинства
- Инициализация выполняется только в тех случаях, когда она действительно необходима;
- ускоряется начальная инициализация.
Недостатки
- Невозможно явным образом задать порядок инициализации объектов;
- возникает задержка при обращении к объекту.
Примеры реализации
Java
<source lang="java"> public class SomeObject { static SomeObject singleInstance = null; String msg;
private SomeObject() { msg = "Instance of SomeObject have been created."; }
public String toString() { return msg; }
// Метод возвращает экземпляр SomeObject, при этом он // создаёт его, если тот ещё не существует public static SomeObject getObject() { if (singleInstance == null) singleInstance = new SomeObject();
return singleInstance; } }
public class Main {
private static long totalMemory; // Этот флаг определяет, было ли выполнено вычисление private static boolean isCalc = false;
private static long getTotalMemory() { // Определяем значение totalMemory только при первом вызове if (!isCalc) { totalMemory = Runtime.getRuntime().totalMemory() / 1024; isCalc = true; }
return totalMemory; }
public static void main(String[] args) {
// Здесь значение будет вычислено System.out.println("Total amount of memory: " + getTotalMemory() + " KB");
// Здесь будет использовано значение, сохранённое в переменной if (getTotalMemory() > 1024) { System.out.println(SomeObject.getObject()); } } } </source>
Пример C#
<source lang="csharp"> public class LazyInitialization<T> where T : new() {
protected LazyInitialization() { }
private static T _instance;
public static T Instance
{
get
{
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...");
//создание объекта происходит только при этом обращении к объекту
System.Console.WriteLine(BigObject.Instance);
System.Console.WriteLine("Второе обращение к экземпляру BigObject...");
System.Console.WriteLine(BigObject.Instance);
//окончание программы
System.Console.ReadLine();
}
} </source>
<source lang="csharp"> 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()
{
// для исключения возможности создания двух объектов
// при многопоточном приложении
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();
}
} </source>
| порождающие шаблоны проектирования |
| абстрактная фабрика | строитель | фабричный метод | прототип | одиночка | отложенная инициализация |
Ссылки
- Русскоязычные сайты
| Для улучшения этой статьи {{Expansion depth limit exceeded|history|история = по истории | география = по географии | математика = по математике | физика = по физике | астрономия = по астрономии | химия = по химии | биология = по биологии | медицина = по медицине | pharmacology|фармакология = по фармакологии | геология = по геологии | лингвистика = по лингвистике | литература = по литературе | музыка = по музыке | искусство = по искусству | theater|театр = по театру | кино = о кино | архитектура = по архитектуре | философия = по философии | религия = по религии | развлечения = по развлечениям | спорт = по спорту | игры = по играм | компьютерные игры = по компьютерным играм | техника = по технике | флот=о флоте | транспорт = по транспорту | телекоммуникации = по телекоммуникациям | comp|computers|ит = по информационным технологиям | социология = по социологии | психология = по психологии | экономика = по экономике | legal|право = по праву | политика = по политике | образование = по образованию | авто|автомобиль = об автомобилях | автопроизводитель = о производителях автомобилей | автотехника = об автомобильной технике
}} желательно?: Шаблон {{Expansion depth limit exceeded|rq}} используется неверно. Укажите хотя бы один параметр. Если Вы уверены, что всё указано правильно, напишите об этом на странице обсуждения шаблона.
|
bg:Късна инициализация (шаблон) cs:Lazy initialization en:Lazy initialization it:Lazy initialization pl:Leniwe inicjowanie (wzorzec projektowy)
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....