Отложенная инициализация (шаблон проектирования)
Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Отложенная (ленивая) инициализация (англ. Lazy initialization). Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция «на лету» и логистическая концепция «Точно в срок».
Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило, он используется в сочетании с такими шаблонами как Фабричный метод, Одиночка и Заместитель.
Содержание |
Достоинства
- Инициализация выполняется только в тех случаях, когда она действительно необходима;
- ускоряется начальная инициализация.
Недостатки
- Невозможно явным образом задать порядок инициализации объектов;
- возникает задержка при обращении к объекту.
Примеры реализации
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()); } } }
Пример C#
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(); } }
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(); } }
| порождающие шаблоны проектирования |
| абстрактная фабрика | строитель | фабричный метод | прототип | одиночка | отложенная инициализация |
Ссылки
- Русскоязычные сайты
<imagemap>
Image:Wiki_letter_w.svg
| Для улучшения этой статьи желательно?:
|
cs:Lazy initialization en:Lazy initialization it:Lazy initialization pl:Leniwe inicjowanie (wzorzec projektowy)