Суть порождающих паттернов заключается в абстракции над механизмами создания объектов. Применяются для того, чтобы отделять логику создания объектов, от логики выполнения операций.
Суть паттерна заключается в вынесении логики создания объектов, нужных при выполнении какой-либо операции в абстрактные методы типа, содержащего логику операции, эти методы будут реализованы типами наследниками.
Состоит из двух иерархий: иерархия Creator
и иерархия Product
.
Предположим вы проектируете систему для автоматизации процессов работы магазина. Изначально в магазине предполагались только платежи наличными, поэтому логика рассчёта стоимости корзины товаров покупателя, привязана к созданию объекта платежа наличными. В какой-то момент нужно добавить новый функционал - оплата через банковскую карту, соотвественно нужно отвязать логику создания платежа от логики рассчёта стоимости.
Данную проблему можно решить с помощью шаблонного метода.
Выделяем логику рассчёта в отдельный абстрактный класс PaymentCalculator
, добавляем ему абстрактный метод CreatePayment
и на каждый различный вид платежей будем создавать тип, наследованный от PaymentCalculator
, в котором определяется логика создания конкретных платежей.
public interface IPayment { }
public abstract class PaymentCalculator
{
public IPayment Calculate()
{
// ...
return CreatePayment(context);
}
protected abstract IPayment CreatePayment(PaymentContext context);
}
public class CashPayment : IPayment
{
// ...
}
public class BankPayment : IPayment
{
// ...
}
public class CashPaymentCalculator : PaymentCalculator
{
protected override IPayment CreatePayment(PaymentContext context)
{
// ...
}
}
public class BankPaymentCalculator : PaymentCalculator
{
protected override IPayment CreatePayment(PaymentContext context)
{
// ...
}
}