ПКРПСиБД LAB3 Бычков А.С. (Лабораторная работа 3)

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

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

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

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

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

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

Московский Энергетический Институт(Технический Университет)

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

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





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

по дисциплине:

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

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











Выполнил:

Бычков А.С.







Москва

2012 г.



Шаблон “ABSTRACT FACTORY”

Категория

Порождающий

Описание

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

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

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

2) Входящие в одно семейство объекты должны использоваться вместе и необходимо выполнить это условие

3) Система конфигурируетс я одним из семейств составляющих их объектов.

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



1) гарантирует сочетаемость продуктов

2) упрощает замену семейств продуктов

Недостатки



1) трудно поддержать добавление нового объекта в семейство.

Реализация

public enum BlanketType { SINGLE, DOUBLE };

public class ClassicBlanket : IBlanket

{

public ClassicBlanket(BlanketType aType)

{

mType = aType;

}

public int getWidth()

{

switch (mType)

{

case BlanketType.SINGLE:

return 80;

case BlanketType.DOUBLE:

return 170;

default: return -1;

}

}

public int getHeight()

{

switch (mType)

{

case BlanketType.SINGLE:

return 125;

case BlanketType.DOUBLE:

return 250;

default: return -1;

}

}

public BlanketType getType()

{

return mType;

}

private BlanketType mType;

}

class ClassicPillow : IPillow

{

public int getWidth()

{

return 60;

}

public int getHeight()

{

return 40;

}

}

public class ClassicStuffFactory : IBedroomStuffFactory

{

public IPillow createPillow()

{

return new ClassicPillow();

}

public IBlanket createBlanket(BlanketType type)

{

return new ClassicBlanket(type);

}

}

public class EuroBlanket : IBlanket

{

public EuroBlanket(BlanketType aType)

{

mType = aType;

}

public int getWidth()

{

switch (mType)

{

case BlanketType.SINGLE:

return 90;

case BlanketType.DOUBLE:

return 180;

default: return -1;

}

}

public int getHeight()

{

switch (mType)

{

case BlanketType.SINGLE:

return 105;

case BlanketType.DOUBLE:

return 210;

default: return -1;

}

}

public BlanketType getType()

{

return mType;

}

private BlanketType mType;

}

class EuroPillow : IPillow

{

public int getWidth()

{

return 70;

}

public int getHeight()

{

return 50;

}

}

public class EuroStuffFactory : IBedroomStuffFactory

{

public IPillow createPillow()

{

return new EuroPillow();

}

public IBlanket createBlanket(BlanketType type)

{

return new EuroBlanket(type);

}

}

public interface IBedroomStuffFactory

{

IPillow createPillow();

IBlanket createBlanket(BlanketType type);

}

public interface IBlanket

{

int getWidth();

int getHeight();

BlanketType getType();

}

public interface IPillow

{

int getWidth();

int getHeight();

}

UML-диаграмма

Тестирование

class Program

{

static void Main(string[] args)

{

Console.Out.WriteLine(">>>>TEST ABSTRACT FACTORY<<<<<");

testFactory(new ClassicStuffFactory());

testFactory(new EuroStuffFactory());

Console.ReadLine();

}

public static void testFactory(IBedroomStuffFactory aFactory)

{

Console.Out.WriteLine("TEST NEW FACTORY");

IBlanket blanket;

IPillow pillow;

blanket = aFactory.createBlanket(BlanketType.DOUBLE);

pillow = aFactory.createPillow();

Console.Out.WriteLine("Blanket: width "+blanket.getWidth()+" height "+ blanket.getHeight()+

" type "+ blanket.getType());

Console.Out.WriteLine("Pillow: width " + pillow.getWidth() + " height " + pillow.getHeight());

}

}

Шаблон “ Factory Method”

Категория

Порождающий

Описание

Предоставляет подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать

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

1) Если классу заранее неизвестно, объекты каких классов необходимо создавать

2) Если класс спроектирован так, что объекты которые он создает специфицируются подклассами

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



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

Недостатки



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


Реализация



Данный паттерн уже был реализован, как часть паттерна Abstract Factory (BedroomStuffFactory.createPillow());



Шаблон “ Lazy initialization”

Категория

Порождающий

Описание

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

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

1) Если полное выделение ресурсов для объекта затруднено или трудоемко

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



1) Экономит расходуемые ресурсы во время выполнения программы

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

Недостатки



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

2) порядок инициализации ресурсов неопределен.


Реализация



public abstract class LazyCanvas

{

private Image mBackground = null;

public readonly int mHeight;

public readonly int mWidth;

public LazyCanvas(int aHeight, int aWidth)

{

mHeight = aHeight;

mWidth = aWidth;

}

abstract protected Image createBackground();

public Image getBackground()

{

if (mBackground == null)

{

mBackground = createBackground();

}

return mBackground;

}

}

public class LazyCanvasImpl : LazyCanvas

{

public LazyCanvasImpl(int aHeight, int aWidth)

: base(aHeight, aWidth)

{

}

protected override Image createBackground()

{

return new Bitmap(mHeight, mWidth);

}

}



namespace LAZY_TEST

{

class Program

{

static void Main(string[] args)

{

LazyCanvas canvas = new LazyCanvasImpl(10000, 50000);

Image background = canvas.getBackground();

}

}

}



UML ДИАГРАММА



Шаблон “ SINGLETON”

Категория

Порождающий

Описание

Гарантирует, что в системе возможно создание только одного экземпляра данного класса и предоставляет интерфейс для его создания.

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

1) Если необходимо жестко регулировать кол-во объектов в системе

2) Объект таков, что логически возможен только один экземпляр объекта

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

1) контролируемый доступ к единственному экземпляру;

2) уменьшение числа имён;

Недостатки

1) Возможные проблемы в тестировании

2) Глобальные переменные плохи для ООП


Реализация

public class Singleton

{

private static Singleton mMember = null;

public readonly int mRandomValue;

private Singleton()

{

Random rnd = new Random();

mRandomValue=rnd.Next();

}

public static Singleton getSingletonObject()

{

if (mMember == null)

{

mMember = new Singleton();

}

return mMember;

}

}

static void Main(string[] args)

{

Singleton sng = Singleton.getSingletonObject();

Console.Out.WriteLine(sng.mRandomValue);

sng = Singleton.getSingletonObject();

Console.Out.WriteLine(sng.mRandomValue);

}

Шаблон “ MULTITION”

Аналогичен паттерну Singleton, но осуществляет доступ к экземплярам объекта по ключу ( например getInstanse(String key) и создает экземпляр если он еще не создан.



Шаблон “ BUILDER”

Категория

Порождающий

Описание

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

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

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

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

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

1) контролируемый доступ к единственному экземпляру;

2) уменьшение числа имён;

Недостатки

Жесткая привязка к порождаемому объекту, поэтому при внесении изменений в класс продукта возможно появится необходимость внести изменения в класс-строитель.


Реализация

public class Barmen

{

CoctailBuilder mBuilder;

public void setCoctailBuilder(CoctailBuilder cb)

{ mBuilder = cb;

}

public Coctail getCoctail()

{

return mBuilder.getCoctail();

}

public void constructCoctail()

{

mBuilder.createNewCoctail();

mBuilder.buildIce();

mBuilder.buildAlcohol();

mBuilder.buildSyrop();

mBuilder.buildFruit();

}

}

public class Coctail

{

private string mAlcohol = "";

private string mIce = "";

private string mSyrop = "";

private string mFruit = "";

public void setAlcohol(String aAlcohol)

{

mAlcohol = aAlcohol;

}

public void setIce(String aIce)

{

mIce = aIce;

}

public void setSyrop(String aIce)

{

mIce = aIce;

}

public void setFruit(String aFruit)

{

mFruit = aFruit;

}

}

public abstract class CoctailBuilder

{

protected Coctail mCoctail;

public Coctail getCoctail()

{

return mCoctail;

}

public void createNewCoctail()

{

mCoctail = new Coctail();

}

public abstract void buildIce();

public abstract void buildSyrop();

public abstract void buildFruit();

public abstract void buildAlcohol();

}

public class MohitoBuilder : CoctailBuilder

{

public override void buildIce()

{

mCoctail.setIce("SNOW");

}

public override void buildSyrop()

{

mCoctail.setSyrop("SPRITE");

}

public override void buildAlcohol()

{

mCoctail.setAlcohol("RUM");

}

public override void buildFruit()

{

mCoctail.setFruit("LIME");

}

}

public class PinaColladaBuilder : CoctailBuilder

{

public override void buildIce()

{

mCoctail.setIce("CUBE");

}

public override void buildSyrop()

{

mCoctail.setSyrop("MILK");

}

public override void buildAlcohol()

{

mCoctail.setAlcohol("VODKA");

}

public override void buildFruit()

{

mCoctail.setFruit("PINEAPPLE");

}

}

Шаблон “OBJECT POOL”

Категория

Порождающий

Описание

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

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



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

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

1) Быстрый доступ к объектам. Экономия затрат памяти.

Недостатки

1) При росте числа объектов в пуле возможно переполнение

2)Неэффективно, если в системе много объектов которые часто используются

Реализация

public interface IPoolable

{

void releaseState();

}

public interface IPoolObjectCreator

{

T Create();

}

public class ObjectPool where T : class, IPoolable

{

private readonly ConcurrentBag mContainer = new ConcurrentBag();

private readonly IPoolObjectCreator mCreator;

public int Count { get { return mContainer.Count; } }

public ObjectPool(IPoolObjectCreator creator)

{

if (creator == null)

{

throw new ArgumentNullException("creator can't be null");

}

mCreator = creator;

}

public T GetObject()

{

T obj;

if (mContainer.TryTake(out obj))

{

return obj;

}

return mCreator.Create();

}

public void ReturnObject (ref T obj)

{

obj.releaseState();

mContainer.Add(obj);

obj = null;

}

}

public class ObjectCreatorImpl : IPoolObjectCreator where T : class, new()

{

T IPoolObjectCreator.Create()

{

return new T();

}

}



static void Main(string[] args)

{

ObjectPool pool = new ObjectPool(new ObjectCreatorImpl());

Console.WriteLine("1) Using 'new' keyword ...");

for (int i = 0; i < 10; i++)

{

TestObject obj = new TestObject();

// Do something with the test object

obj.Index = i;

}

Console.WriteLine("2) Using Object pool ...");

for (int i = 0; i < 10; i++)

{

TestObject obj = pool.GetObject();

// Do something with the test object

obj.Index = i;

pool.ReturnObject(ref obj);

}

Console.ReadLine();

}

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