Отложенная инициализация (шаблон проектирования) | это... Что такое Отложенная инициализация (шаблон проектирования)? (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.

Полезное

Смотреть что такое "Отложенная инициализация (шаблон проектирования)" в других словарях: