Middle
128
questionbank
В чем заключается реализация паттерна абстрактной фабрики?
Answer from AI
sobes.tech AI
Реализация паттерна "Фабрика" (Factory Method) заключается в создании интерфейса для создания объектов, но предоставлении подклассам возможности решать, какой именно класс будет создан.
Ключевые элементы:
- Creator (Создатель): Объявляет фабричный метод, который возвращает объект типа Product. Creator может также определять реализацию по умолчанию фабричного метода, которая возвращает объект Product по умолчанию.
- ConcreteCreator (Конкретный Создатель): Переопределяет фабричный метод для возвращения экземпляра ConcreteProduct.
- Product (Продукт): Определяет интерфейс объектов, создаваемых фабричным методом.
- ConcreteProduct (Конкретный Продукт): Реализует интерфейс Product.
Пример UML:
graph TD
A[Creator] --> B[+ FactoryMethod(): Product]
B --> C[Product]
A --> D[ConcreteCreator]
D --> E[+ FactoryMethod(): Product]
E --> F[ConcreteProduct]
C --> F
D .> F
Пример на C#:
// Product
public interface IProduct
{
string Operation();
}
// ConcreteProduct A
public class ConcreteProductA : IProduct
{
public string Operation()
{
return "Result of ConcreteProductA";
}
}
// ConcreteProduct B
public class ConcreteProductB : IProduct
{
public string Operation()
{
return "Result of ConcreteProductB";
}
}
// Creator
public abstract class Creator
{
// Фабричный метод
public abstract IProduct FactoryMethod();
// Может содержать логику, использующую фабричный метод
public string SomeOperation()
{
IProduct product = FactoryMethod();
return $"Creator: The same creator's code has just worked with {product.Operation()}";
}
}
// ConcreteCreator A
public class ConcreteCreatorA : Creator
{
public override IProduct FactoryMethod()
{
return new ConcreteProductA();
}
}
// ConcreteCreator B
public class ConcreteCreatorB : Creator
{
public override IProduct FactoryMethod()
{
return new ConcreteProductB();
}
}
В этом примере, Creator определяет шаблон для создания IProduct, но конкретную реализацию (ConcreteProductA или ConcreteProductB) выбирают подклассы ConcreteCreatorA и ConcreteCreatorB путем переопределения метода FactoryMethod. Это позволяет клиентам использовать Creator и его подклассы, не зная конкретных типов создаваемых объектов, что обеспечивает гибкость и расширяемость системы.