Суть порождающих паттернов заключается в абстракции над механизмами создания объектов. Применяются для того, чтобы отделять логику создания объектов, от логики выполнения операций.

Factory Method

Суть паттерна заключается в вынесении логики создания объектов, нужных при выполнении какой-либо операции в абстрактные методы типа, содержащего логику операции, эти методы будут реализованы типами наследниками.

Структура

Состоит из двух иерархий: иерархия Creator и иерархия Product.

Untitled

Юзкейс

Предположим вы проектируете систему для автоматизации процессов работы магазина. Изначально в магазине предполагались только платежи наличными, поэтому логика рассчёта стоимости корзины товаров покупателя, привязана к созданию объекта платежа наличными. В какой-то момент нужно добавить новый функционал - оплата через банковскую карту, соотвественно нужно отвязать логику создания платежа от логики рассчёта стоимости.

Данную проблему можно решить с помощью шаблонного метода.

Выделяем логику рассчёта в отдельный абстрактный класс PaymentCalculator, добавляем ему абстрактный метод CreatePayment и на каждый различный вид платежей будем создавать тип, наследованный от PaymentCalculator, в котором определяется логика создания конкретных платежей.

Untitled

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)
		{
				// ...
		}
}

Плюсы