I currently have a factory class that looks like this:
public static class OrderFactory
{
public static Order GetOrder(OrderInformation orderInfo, Logger logger, string overlayPath)
{
switch (orderInfo.Type)
{
case OrderType.Print:
return new Print(orderInfo, logger, overlayPath);
case OrderType.Cad:
return new Cad(orderInfo, logger, overlayPath);
case OrderType.Litho:
return new Litho(orderInfo, logger, overlayPath);
case OrderType.Error:
default:
return new OrderError(orderInfo, logger, overlayPath);
}
}
}
public abstract class Order
{
protected OrderInformation OrderInfo { get; set; }
protected Logger Logger { get; set; }
protected string OverlayPath { get; set; }
public Order(OrderInformation orderInfo, Logger logger, string overlayPath)
{
OrderInfo = orderInfo;
Logger = logger;
OverlayPath = overlayPath;
}
public abstract Task<bool> CreateImage()
}
public class Print : Order
{
public Print(OrderInformation orderInfo, Logger logger, string overlayPath)
: base(orderInfo, logger, overlayPath)
{ }
public override async Task<bool> CreateThumbs(CorelAppWrapper corelAppWrapper, int timeBeforeFirstAbort, int timeBeforeRetryAbort)
{
I would like to use a delegate pattern or something else mostly to avoid using a switch statement and also knowing one day we will have to quickly extend this method. I want to use the Delegate Dictionary Pattern or something similar to it. I tried code like this:
private delegate Order Order(OrderInformation orderInfo, Logger logger, string overlayPath);
private static readonly Dictionary<OrderType, Order>
mTypeConstructors = new Dictionary<OrderType, Order>
{
{ OrderType.Print, (orderInfo, logger, overlayPath) => new Print(orderInfo, logger, overlayPath) },
...//etc
};
Doing it this way throws an error saying that Print
type cannot be converted to Order
type. What can I do to get around this?