
Национальный исследовательский институт
Московский Энергетический Институт(Технический Университет)
Институт автоматики и вычислительной техники
Кафедра Прикладной математики
Лабораторная работа №3
по дисциплине:
Проектирование крупных распределенных программных систем и баз данных
тема: «Реализация порождающего шаблона проектирования»
Выполнил:
Бычков А.С.
Москва
2012 г.
Шаблон “ABSTRACTFACTORY”
Категория
Порождающий
Описание
Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов
Уместность применения
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();
}