ПКРПСиБД LAB3 Моисеев Н.А. (Лабораторная работа 3)

2015-08-23СтудИзба

Описание файла

Файл "ПКРПСиБД LAB3 Моисеев Н.А." внутри архива находится в папке "Лабораторная работа 3". Документ из архива "Лабораторная работа 3", который расположен в категории "". Всё это находится в предмете "распределённые ис и базы данных" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "распределённые ис и базы данных" в общих файлах.

Онлайн просмотр документа "ПКРПСиБД LAB3 Моисеев Н.А."

Текст из документа "ПКРПСиБД LAB3 Моисеев Н.А."

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

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


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

дисциплине: «Распределённые информационные системы и

базы данных»

Реализация порождающих шаблонов проектирования

Студент:

Моисеев Н.А.

Группа:

А-13-07

Преподаватель:

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

Москва 2012

Абстрактная фабрика.

Описание

Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение.

Применение

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Преимущества

  • Изолирует конкретные классы;

  • Упрощает замену семейств продуктов;

  • Гарантирует сочетаемость продуктов

Недостатки

  • Сложно добавить поддержку нового вида продуктов.

Детали реализации

public abstract class UnitAbstractFactory

{

public abstract IProductive CreateProductive(int x, int y);

public abstract IWorker CreateWorker();

public abstract IWarrior CreateWarrior();

}

public class GnomeFactory : UnitAbstractFactory

{

public GnomeFactory()

{

Console.WriteLine();

Console.WriteLine("============================");

Console.WriteLine("Move gnomes:");

Console.WriteLine();

}

public override IProductive CreateProductive(int x, int y)

{

return new Mine(x, y);

}

public override IWorker CreateWorker()

{

return new Miner();

}

public override IWarrior CreateWarrior()

{

return new Axer();

}

}

public class HumanFactory : UnitAbstractFactory

{

public HumanFactory()

{

Console.WriteLine();

Console.WriteLine("============================");

Console.WriteLine("Move humans:");

Console.WriteLine();

}

public override IProductive CreateProductive(int x, int y)

{

return new Ferma(x, y);

}

public override IWorker CreateWorker()

{

return new Fermer();

}

public override IWarrior CreateWarrior()

{

return new Knight();

}

}

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

Фабричный метод

Описание

Фабричный метод (англ. Factory Method) — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса.

Применение

Используется, когда:

  • Классу заранее неизвестно, объекты каких подклассов ему нужно создавать.

  • Класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.

  • Класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

Преимущества

  • позволяет сделать код создания объектов более универсальным, не привязываясь к конкретным классам, а оперируя лишь общим интерфейсом ;

  • позволяет установить связь между параллельными иерархиями классов.

Недостатки

  • необходимость создавать наследника для каждого нового типа продукта.

Детали реализации

public abstract class GameObject

{

protected GameObject()

{

Console.WriteLine("Create " + GetType().Name);

}

}

public class Unit : GameObject

{

}

public class Terrain : GameObject

{

}

public abstract class Creator

{

public abstract GameObject FactoryMethod();

}

public class UnitCreator : Creator

{

public override GameObject FactoryMethod()

{

return new Unit();

}

}

public class TerrainCreator : Creator

{

public override GameObject FactoryMethod()

{

return new Terrain();

}

}

class Program

{

static void Main()

{

var creators = new Creator[] {new UnitCreator(), new TerrainCreator()};

foreach (var gameObject in creators.Select(creator =>

creator.FactoryMethod()))

{

}

Console.ReadLine();

}

}

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

Отложенная инициализация

Описание

Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно.

Применение

Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило, он используется в сочетании с такими шаблонами как Фабричный метод, Одиночка и Заместитель.

Преимущества

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

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

Недостатки

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

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

Детали реализации

public class LazyInitializator where T : new()

{

protected LazyInitializator()

{

}

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 : LazyInitializator

{

public BigObject()

{

//Большая работа

System.Threading.Thread.Sleep(3000);

System.Console.WriteLine("Экземпляр BigObject создан");

}

}

class Program

{

static void Main()

{

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

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

Console.WriteLine(BigObject.Instance);

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

Console.WriteLine(BigObject.Instance);

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

Console.ReadLine();

}

}

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

Объектный пул

Описание

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

Преимущества

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

Недостатки

  • После того, как объект возвращён, он должен вернуться в состояние, пригодное для дальнейшего использования. Если объекты после возвращения в пул оказываются в неправильном или неопределённом состоянии, такая конструкция называется объектной клоакой (англ. object cesspool).

  • Повторное использование объектов также может привести к утечке информации. Если в объекте есть секретные данные (например, номер кредитной карты), после освобождения объекта эту информацию надо затереть.

Детали реализации

public class Reusable

{

public Object[] Objs { get; protected set; }

public Reusable(params Object[] objs)

{

Objs = objs;

}

}

public class Creator : ICreation

{

private static Int32 _id;

public Reusable Create()

{

++_id;

return new Reusable(_id);

}

}

public class ReusablePool : ObjectPool

{

public ReusablePool()

: base(new Creator(), 2)

{

}

}

class Program

{

static void Main()

{

Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

var reusablePool = new ReusablePool();

var thrd1 = new Thread(Run);

var thrd2 = new Thread(Run);

var thisObject1 = reusablePool.GetObject();

var thisObject2 = reusablePool.GetObject();

thrd1.Start(reusablePool);

thrd2.Start(reusablePool);

ViewObject(thisObject1);

ViewObject(thisObject2);

Thread.Sleep(2000);

reusablePool.Release(thisObject1);

Thread.Sleep(2000);

reusablePool.Release(thisObject2);

Console.ReadKey();

}

private static void Run(Object obj)

{

Console.WriteLine("\t" + System.Reflection.MethodBase.GetCurrentMethod().Name);

var reusablePool = (ReusablePool)obj;

Console.WriteLine("\tstart wait");

var thisObject1 = reusablePool.WaitForObject();

ViewObject(thisObject1);

Console.WriteLine("\tend wait");

reusablePool.Release(thisObject1);

}

private static void ViewObject(Reusable thisObject)

{

foreach (var obj in thisObject.Objs)

{

Console.Write(obj + @" ");

}

Console.WriteLine();

}

}

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

Строитель

Описание

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

Преимущества

  • Позволяет изменять внутреннее представление продукта;

  • Изолирует код, реализующий конструирование и представление;

  • Дает более тонкий контроль над процессом конструирования.

Недостатки

  • Данный шаблон не скрывает реализацию порождаемых объектов, а создает то, что требуется;

  • Как следствие, результатом работы могут быть объекты, не связанные явно между собой. Как правило, у них единые цели, но не обязательно есть общие интерфейсы, базовые классы и т.д.



Детали реализации

public interface IPageBuilder

{

void BuildHeader(HeaderData header);

void BuildMenu(MenuItems items);

void BuildPost(PostData post);

void BuildFooter(FooterData footer);

}

public class PageDirector

{

private readonly IPageBuilder _builder;

private static HeaderData GetHeader(int pageId) { return new HeaderData(pageId); }

private static MenuItems GetMenuItems(int pageId) { return new MenuItems(pageId); }

private static IEnumerable GetPosts(int pageId)

{

return new List

{

new PostData(pageId),

new PostData(pageId)

};

}

private static FooterData GetFooter(int pageId) { return new FooterData(pageId); }

public PageDirector(IPageBuilder builder)

{

_builder = builder;

}

public void BuildPage(int pageId)

{

_builder.BuildHeader(GetHeader(pageId));

_builder.BuildMenu(GetMenuItems(pageId));

foreach (var post in GetPosts(pageId))

{

_builder.BuildPost(post);

}

_builder.BuildFooter(GetFooter(pageId));

}

}

public class PageBuilder : IPageBuilder

{

private readonly Page _page = new Page();

public void BuildHeader(HeaderData header) { _page.AddHeader(header); }

public void BuildMenu(MenuItems menuItems) { _page.SetMenuItems(menuItems); }

public void BuildPost(PostData post) { _page.AddPost(post); }

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5167
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее