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