Middle
125
questionbank
В чем состоит реализация паттерна абстрактной фабрики?
Answer from AI
sobes.tech AI
Паттерн Abstract Factory предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Основные компоненты:
- Abstract Factory: Объявляет интерфейс для операций создания абстрактных продуктов.
- Concrete Factory: Реализует операции создания абстрактных продуктов для конкретного семейства продуктов.
- Abstract Product: Объявляет интерфейс для типа продукта.
- Concrete Product: Реализует интерфейс Abstract Product для конкретного продукта.
- Client: Использует интерфейсы Abstract Factory и Abstract Product, но не знает о Concrete Factory и Concrete Product.
Реализация:
- Определяется абстрактная фабрика с методами для создания каждого типа продукта.
- Для каждого семейства продуктов создается конкретная фабрика, реализующая методы абстрактной фабрики и создающая соответствующие конкретные продукты.
- Для каждого типа продукта определяется абстрактный интерфейс продукта.
- Для каждого конкретного продукта создается класс, реализующий соответствующий интерфейс продукта.
- Клиентская часть получает объект абстрактной фабрики и вызывает ее методы для создания продуктов, работая только с интерфейсами продуктов.
// Абстрактная фабрика
public interface IAbstractFactory
{
IAbstractProductA CreateProductA();
IAbstractProductB CreateProductB();
}
// Конкретная фабрика 1
public class ConcreteFactory1 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
// Конкретная фабрика 2
public class ConcreteFactory2 : IAbstractFactory
{
public IAbstractProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IAbstractProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
// Абстрактный продукт A
public interface IAbstractProductA
{
string UsefulFunctionA();
}
// Конкретный продукт A1
public class ConcreteProductA1 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "The result of the product A1.";
}
}
// Конкретный продукт A2
public class ConcreteProductA2 : IAbstractProductA
{
public string UsefulFunctionA()
{
return "The result of the product A2.";
}
}
// Абстрактный продукт B
public interface IAbstractProductB
{
string UsefulFunctionB();
string AnotherUsefulFunctionB(IAbstractProductA collaborator);
}
// Конкретный продукт B1
public class ConcreteProductB1 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "The result of the product B1.";
}
// Продукт B1 может работать только с продуктами A того же варианта
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"The result of the B1 collaborating with the ({result})";
}
}
// Конкретный продукт B2
public class ConcreteProductB2 : IAbstractProductB
{
public string UsefulFunctionB()
{
return "The result of the product B2.";
}
// Продукт B2 может работать только с продуктами A того же варианта
public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
{
var result = collaborator.UsefulFunctionA();
return $"The result of the B2 collaborating with the ({result})";
}
}
// Клиентский код
public class Client
{
public void Main()
{
// Клиентский код работает с абстрактной фабрикой
Console.WriteLine("Client: Testing client code with the first factory type:");
ClientMethod(new ConcreteFactory1());
Console.WriteLine();
Console.WriteLine("Client: Testing the same client code with the second factory type:");
ClientMethod(new ConcreteFactory2());
}
public void ClientMethod(IAbstractFactory factory)
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productB.UsefulFunctionB());
Console.WriteLine(productB.AnotherUsefulFunctionB(productA));
}
}