Шаблон Абстрактная фабрика предназначен для создания объектов, принадлежащих одному набору классов и используемых совместно. Абстрактная фабрика переопределяется в конкретных классах-фабриках, создающих объекты одного набора. Этот шаблон изолирует имена классов и их определения от клиента: единственный способ для клиента получить необходимый объект – это воспользоваться одной из реализаций абстрактной фабрики.
Дизайн шаблона Абстрактная фабрика включает большое число участников, однако он достаточно прост (рис. 8). Клиент работает с определённым набором объектов, но использует для этого только реализуемые классами объектов интерфейсы (IProductA и IProductB). Клиент хранит ссылку на конкретную фабрику, реализующую интерфейс IFactory. Для получения нужного объекта клиент вызывает один из методов фабрики.
Рис. 8. Шаблон абстрактная фабрика.
Рассмотрим пример кода с реализацией шаблона Абстрактная фабрика. Пусть клиент работает с интерфейсами для представления сумок и туфель.
|
|
public interface IBag
{
string Material { get; }
}
public interface IShoes
{
int Price { get; }
}
Имеется два набора классов, реализующих указанные интерфейсы.
// сумка и туфли Gucci
public class GucciBag: IBag
{
public string Material
{
get { return "Crocodile skin"; }
}
}
public class GucciShoes: IShoes
{
public int Price
{
get { return 1000; }
}
}
// сумка и туфли Poochy:)
public class PoochyBag: IBag
{
public string Material
{
get { return "Plastic"; }
}
}
public class PoochyShoes: IShoes
{
public int Price
{
get { return 50; }
}
}
Опишем фабричный интерфейс и реализуем две конкретные фабрики.
public interface IFactory
{
IBag CreateBag();
IShoes CreateShoes();
}
public class GucciFactory: IFactory
{
public IBag CreateBag()
{
return new GucciBag();
}
public IShoes CreateShoes()
{
return new GucciShoes();
}
}
public class ChinaFactory: IFactory
{
public IBag CreateBag()
{
return new PoochyBag();
}
public IShoes CreateShoes()
{
return new PoochyShoes();
}
}
Код клиента один раз создаёт требуемую фабрику, а далее работает только с интерфейсами фабрики и товаров.
// можно изменить на factory = new ChinaFactory();
IFactory factory = new GucciFactory();
IBag bag = factory.CreateBag();
IShoes shoes = factory.CreateShoes();