- Отложенная инициализация (шаблон проектирования)
-
Отложенная инициализация (шаблон проектирования)
Отложенная (ленивая) инициализация (англ. 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(); } }
Ссылки
- Русскоязычные сайты
Шаблоны проектирования Основные Порождающие абстрактная фабрика • строитель • фабричный метод • прототип • одиночка • отложенная инициализация • объектный пул
Структурные Поведения цепочка обязанностей • команда • интерпретатор • итератор • посредник • хранитель • наблюдатель • состояние • стратегия • шаблонный метод • посетитель
программирования
Wikimedia Foundation. 2010.
Ленивая инициализация (шаблон проектирования) — Отложенная (ленивая) инициализация (англ. Lazy initialization). Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат.… … Википедия
Отложенная инициализация — Шаблон проектирования Отложенная (ленивая) инициализация Lazy initialization Описан в Design Patterns Нет Отложенная (ленивая) инициализация (англ. Lazy initialization). Приём в программировании, когда некоторая ресурсоёмкая операция… … Википедия
Шаблон проектирования — У этого термина существуют и другие значения, см. Паттерн. В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) повторимая архитектурная конструкция, представляющая собой решение проблемы… … Википедия
Абстрактная фабрика (шаблон проектирования) — Шаблон проектирования Абстрактная фабрика Abstract factory Тип: порождающий Описан в Design Patterns Да Абстрактная фабрика (англ. Abstract factory) порождающий шаблон проектирования, позволяющий изменять поведение системы … Википедия
Шаблонный метод (шаблон проектирования) — Шаблон проектирования Шаблонный метод Template method Тип: поведенческий Описан в Design Patterns Да … Википедия
Фабричный метод (шаблон проектирования) — Шаблон проектирования Фабричный метод Factory Method Тип: порождающий Описан в Design Patterns Да Фабричный метод (англ. Factory Method) порождающий шаблон проектирования, предоставляющий подклассам интерфейс для созда … Википедия
Инициализация — Инициализация (от англ. initialization, инициирование) создание, активация, подготовка к работе, определение параметров. Приведение программы или устройства в состояние готовности к использованию.[1] Термин употребляется как для… … Википедия
Фабрика (шаблон проектирования) — Фабричный метод (англ. Factory Method) порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс инстанциировать. Иными словами,… … Википедия
Интерфейс (шаблон проектирования) — Шаблон проектирования Интерфейс Interface Описан в Design Patterns Нет В информатике, шаблон интерфейса не является особым шаблоном среди шаблонов проектирования. Он является общим методом для структурирования компьютерных программ для того … Википедия
Хранитель (шаблон проектирования) — Шаблон проектирования Хранитель Memento Тип: поведенческий Описан в Design Patterns Да Хранитель (также известный как Memento, Token, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс … Википедия