Лабораторная работа 3 (ПКРПСиБД LAB3 Степная Е.В.)

Посмотреть архив целиком

Национальный исследовательский университет

«Московский Энергетический Институт»

Институт автоматики и вычислительной техники

Кафедра прикладной математики















Лабораторная работа №3

По дисциплине «Проектирование крупных программных систем и баз данных»

На тему «Реализация одного из порождающих шаблонов проектирования»



Выполнила студентка

Группы А-13-08

Степная Е.В.



Проверил

Куриленко И.Е.







Москва, 2012



Шаблон проектирования

Необходимо реализовать шаблон проектирования «Отложенная инициализация» (Lazy initialization).

Описание

Шаблон "Отложенная инициализация" позволяет отложить действия, связанные с созданием объекта, до момента, когда непосредственно потребуется результат этих действий.

Данный шаблон используется если:

  • создание объекта связано с большими затратами ресурсов;

  • есть вероятность, что объект или его часть не будут использованы.

При этом возможно разделение одной длительной процедуры инициализации на несколько более коротких, выполняющихся в различных местах программы.

При использовании указанного шаблона необходимо учитывать, что возможно появление задержки при первом обращении к объекту или некоторым его методам.

Отложенная инициализация часто используется с такими шаблонами как "Одиночка", "Фабричный метод", "Абстрактная фабрика".

Уместность применения

Отложенная инициализация в основном используется, чтобы повысить быстродействие, избежать ресурсоемких вычислений и уменьшить требования к памяти программы. Ниже приведены наиболее распространенные сценарии:

  • При наличии объекта, создание которого требует много ресурсов, которые станут недоступны программе. Например, пусть в памяти находится объект Customer, у которого есть свойство Orders, содержащее большой массив объектов Order, инициализация которых требует подключения к базе данных. Если пользователь никогда не отображает массив Orders и не использует данные в расчетах, то нет смысла использовать системную память или такты процессора для создания этого массива. Используя Lazy, чтобы объявить отложенную инициализацию объекта Orders, можно избежать расхода системных ресурсов на неиспользуемый объект.

  • При наличии объекта, создание которого, требующее много ресурсов, желательно отложить до завершения других ресурсоемких операций. Например, пусть программа во время запуска загружает несколько экземпляров объекта, но только часть из них требуется сразу. Можно повысить быстродействие программы при запуске, отложив инициализацию временно не нужных объектов до того, как они понадобятся.

Преимущества, достигаемые при применении шаблона

  • Инициализация выполняется только в тех случаях, когда она действительно необходима;

  • ускоряется начальная инициализация.

Недостатки шаблона

  • Невозможно явным образом задать порядок инициализации объектов;

  • возникает задержка при первом обращении к объекту.

Реализация

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace Lab2

{

public class LazyInitialization where T : new()

{

protected LazyInitialization() { }


private static T _instance;

public static T Instance

{

get

{

if (_instance == null)

{

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("Нажмите любую клавишу..");

System.Console.ReadLine();

System.Console.WriteLine("Первое обращение к экземпляру BigObject...");


//создание объекта происходит только при этом обращении к объекту

System.Console.WriteLine(BigObject.Instance);

System.Console.WriteLine("Нажмите любую клавишу..");

System.Console.ReadLine();

System.Console.WriteLine("Второе обращение к экземпляру BigObject...");

System.Console.WriteLine(BigObject.Instance);


//окончание программы

System.Console.WriteLine("Нажмите любую клавишу..");

System.Console.ReadLine();

}

}

}


UML-диаграммы

Диаграмма классов

Диаграмма последовательности








Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.