Отложенная инициализация (шаблон проектирования)

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Отложенная (ленивая) инициализация (англ. {{{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>


порождающие шаблоны проектирования
абстрактная фабрика | строитель | фабричный метод | прототип | одиночка | отложенная инициализация

Ссылки

Русскоязычные сайты


bg:Късна инициализация (шаблон) cs:Lazy initialization en:Lazy initialization it:Lazy initialization pl:Leniwe inicjowanie (wzorzec projektowy)

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....