Абстрактная фабрика (Abstract factory)

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

Дизайн шаблона Абстрактная фабрика включает большое число участников, однако он достаточно прост (рис. 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();


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: