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

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

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

Отложенная (ленивая) инициализация (англ. 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, Лексема) поведенческий шаблон проектирования. Позволяет, не нарушая инкапсуляцию, зафикс …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»