Фабричный метод используется для создания одного! объекта с определенным интерфейсом (типом).
Фабричный метод относится к порождающим шаблонам проектирования. Порождающие шаблоны проектирования используются для создания объектов, причем они позволяют быть независимыми от типа создаваемого объекта и от процесса создания.
Фабричный метод используется, когда:
Действующие лица:
Фабричный метод относится к порождающим шаблонам проектирования. Порождающие шаблоны проектирования используются для создания объектов, причем они позволяют быть независимыми от типа создаваемого объекта и от процесса создания.
Фабричный метод используется, когда:
- Заранее известно, когда создавать объект, но не известен его тип.
- Созданные фабричным методом объекты должны определятся уже в подклассе.
- Класс делегирует свои методы производному классу, после чего происходит определение, какой класс принимает какие методы.
Диаграмма:
Действующие лица:
- Product — продукт
- определяет интерфейс объектов, создаваемых абстрактным методом;
- ConcreteProduct — конкретный продукт
- реализует интерфейс Product (то есть у нас есть интерфейс IProduct, от которого у нас несколько производных классов, типа ConcreteProductA, либо ConcreteProductB и так далее)
- Creator — создатель
- предназначен, для реализации интерфейса от производных классов типа ConcreteCreator
- содержит фабричный метод для создания объекта типа Product, который переопределяется в классах ConcreteCreatorA, ConcreteCreatorB;
- ConcreteCreator — конкретный создатель
- переопределяет фабричный метод таким образом, чтобы он создавал и возвращал объект класса ConcreteProduct.
На основе класса Factory создается один или несколько классов фабрик (причем эти фабрики имеют тип), и эти фабрики создают конкретные модели.
Шаблон:
//абстрактный класс создателя, который имеет абстрактный метод FactoryMethod, принимающий тип продукта
public abstract class Creator
{
public abstract Product FactoryMethod(int type);
}
public class ConcreteCreator : Creator
{
public override Product FactoryMethod(int type)
{
switch (type)
{
//возвращает объект A, если type==1
case 1: return new ConcreteProductA();
//возвращает объект B, если type==2
case 2: return new ConcreteProductB();
default: throw new ArgumentException("Invalid type.", "type");
}
}
}
public abstract class Product { } //абстрактный класс продукт
//конкретные продукты с разной реализацией
public class ConcreteProductA : Product { }
public class ConcreteProductB : Product { }
//
Потом в Main()
static void Main()
{ //создаем создателя
Creator creator = new ConcreteCreator();
for (int i = 1; i <= 2; i++)
{
//создаем сначала продукт с типом 1, потом с типом 2
var product = creator.FactoryMethod(i);
Console.WriteLine("Where id = {0}, Created {1} ", i, product.GetType());
}
}
Здесь сначала создается сам конкретный создатель, который потом будет использоваться в создании продуктов, сначала ConcreteProductA, вывод на экран типа, потом ConcreteProductB, и также вывод его типа.Итак, подводим итоги:
Самый главный недостаток, это необходимость создания объекта Creator для того, чтобы создать любой продукт с помощью метода FactoryMethod().
0 коммент.:
Отправить комментарий