У меня есть задача, где мне нужно внедрить базовую c систему корзины покупок. В этой корзине будут различные типы кампаний, которые применимы к категории товаров. Эти кампании собираются применять различные виды скидок. Чтобы добиться этого, я решил реализовать фабричный шаблон.
Давайте начнем с базового класса для всех типов скидок;
public abstract class Discount
{
public Category Category { get; set; }
public int MinimumItems { get; set; }
public Discount(Category category, int minItems)
{
Category = category;
MinimumItems = minItems;
}
}
Интерфейс кампании;
public interface ICampaign
{
void ApplyDiscount(ShoppingCart card);
}
Тип кампании, который применяется на основе суммы денег (например, скидка 100 долларов США над ценой);
public class AmountDiscount : Discount, ICampaign
{
public decimal DiscountAmount { get; set; }
public AmountDiscountGenerator(Category category, int minItems, decimal discountAmount) : base(category, minItems)
{
DiscountAmount = discountAmount;
}
public void ApplyDiscount(ShoppingCart card)
{
card.TotalPrice() -= DiscountAmount;
}
Тип кампании, который применяется на основе ставки (например, скидка 20% от цены) ;
public class RateDiscountGenerator : Discount, ICampaignGenerator
{
public double DiscountRate { get; set; }
public RateDiscountGenerator(Category category, int minItems, double discountRate) : base(category, minItems)
{
DiscountRate = discountRate;
}
public void ApplyDiscount(ShoppingCart card)
{
card.TotalPrice() -= card.TotalPrice() * DiscountRate / 100;
}
Как видите, разные классы кампаний отличаются по алгоритму *1016* метода . Но также отличается то, что один из них имеет элемент данных с именем DiscountAmount
, а другой - DiscountRate
.
Вот класс фабрики, который я реализовал;
public static class CampaignFactory
{
public static ICampaign GenerateCampaign(Category category, int minItems, int amountOrRate, DiscountType discountType)
{
if(discountType == DiscountType.Amount)
{
return new AmountDiscountGenerator(category, minItems, amountOrRate);
}
else if(discountType == DiscountType.Rate)
{
return new RateDiscountGenerator(category, minItems, amountOrRate);
}
}
}
Проблема с моим классом фабрики - параметр с именем amountOrRate
. Чтобы инициализировать свойства DiscountAmount
или DiscountRate
, мне нужно иметь общий параметр в классе фабрики, но так как эти свойства семантически отличаются, мне кажется неправильным принимать общий параметр в методе фабрики и в классе кампании Конструкторы поделятся этим (вы можете понять мое замешательство по названию параметра amountOrRate
).
Можете ли вы помочь мне реализовать шаблон на этом конкретном примере? Вы также можете посоветовать мне, если мне нужно реализовать различные шаблоны проектирования с помощью заводского шаблона (например, шаблон стратегии). Любая помощь приветствуется, спасибо.