Отложенная инициализация (шаблон проектирования) | это... Что такое Отложенная инициализация (шаблон проектирования)? (original) (raw)
Отложенная инициализация (шаблон проектирования)
Отложенная инициализация (шаблон проектирования)
Отложенная инициализация (шаблон проектирования)
Отложенная (ленивая) инициализация (англ. 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 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
{
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();
} }
Ссылки
Русскоязычные сайты
Шаблоны проектирования | |
---|---|
Основные | шаблон делегирования • шаблон функционального дизайна • неизменяемый объект • Interface |
Порождающие | абстрактная фабрика • строитель • фабричный метод • прототип • одиночка • отложенная инициализация • объектный пул |
Структурные | адаптер • мост • компоновщик • декоратор • фасад • заместитель • приспособленец • выделение частного класса данных |
Поведения | цепочка обязанностей • команда • интерпретатор • итератор • посредник • хранитель • наблюдатель • состояние • стратегия • шаблонный метод • посетитель |
программирования | блокировка с двойной проверкой • планировщик • однопоточное выполнение |
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, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс … Википедия