ПКРПСиБД LAB3 Моисеев Н.А. (Лабораторная работа 3)
Описание файла
Файл "ПКРПСиБД 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
{
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); }