Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шаблоны проектирования.pdf
Скачиваний:
75
Добавлен:
11.05.2015
Размер:
1.13 Mб
Скачать

3.7. Фабричный метод (Factory method)

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

IProduct product= creator.FactoryMethod()

Client

Creator

<<interface>>

 

IProduct

+FactoryMethod():IProduct

 

 

 

ProductB

ProductA

Рис. 11. Диаграмма шаблона Фабричный метод.

Для иллюстрации шаблона Фабричный метод представим магазин, торгующий определённым видом фруктов. Магазин (выступающий в роли клиента) работает с поставщиком (фабричный метод), который в зависимости от времени года импортирует фрукты (объекты) из разных стран (разные классы объектов). Детали операций импорта от клиента скрыты. Далее приведён код, использующий шаблон Фабричный метод и соответствующий описанному выше примеру.

public interface IProduct

{

string ShipFrom();

}

public class ProductFromAfrica : IProduct

{

public string ShipFrom()

{

return "from South Africa";

}

}

30

public class ProductFromSpain : IProduct

{

public string ShipFrom()

{

return "from Spain";

}

}

public class DefaultProduct : IProduct

{

public string ShipFrom()

{

return "not available";

}

}

public class Creator

{

public IProduct FactoryMethod(int month)

{

if (month >= 4 && month <= 11)

{

return new ProductFromAfrica();

}

if (month == 1 || month == 2 || month == 12)

{

return new ProductFromSpain();

}

return new DefaultProduct();

}

}

public class FactoryMethodExample

{

public static void Main()

{

var creator = new Creator(); IProduct product;

for (var i = 1; i <= 12; i++)

{

product = creator.FactoryMethod(i); System.Console.WriteLine("Avocados " +

product.ShipFrom());

}

}

}

31