У меня разные классы фруктов, все они реализуют один и тот же интерфейс
public interface IApple : IFruit{ }
public interface IBanana : IFruit{ }
public interface ICarrot: IFruit{ }
У каждого из них есть свой ящик:
public class AppleDrawer
{
public void Draw(IApple apple, Graphics graphics){}
}
public class BananaDrawer
{
public void Draw(IBanana banana, Graphics graphics){}
}
Если я хочу составить список фруктов, я делаю следующее
public void DrawFruits(List<IFruit> fruits, Graphics graphics)
{
foreach(var fruit in fruits)
{
if(fruit is IBanana)
{
var banana = (IBanana)fruit;
var drawer = new BananaDrawer();
drawer.Draw(banana, graphics);
}
else if(fruit is IApple)
{
var apple = (IApple)fruit;
var drawer = new AppleDrawer();
drawer.Draw(banana, graphics);
}
etc...
}
Я чувствую себя очень грязно, когда читаю мой код.
Моя проблема заключается в многократном утверждении if..else, потому что у меня 12 разных плодов, и я должен много делать это утверждение в моем текущем проекте.
Есть ли способ рефакторинга моего метода DrawFruits?
Я думаю о каком-то заводском паттерне, но не понимаю, как это сделать.
Должен ли мой фруктовый класс взять Ящик в собственность? Или, может быть, я могу вызвать метод Drawer Factory?
Это образец, который я часто нахожу в моем текущем проекте, и я не нахожу решение, которое меня устраивает.