工厂方法 - 在.NET 2.0中通过ID获取

时间:2012-09-20 08:48:51

标签: c# factory-pattern

我正在尝试实施工厂。据我了解,以下简单代码是工厂(C#)

private void methodName()
{
    var result = GetTypeByName("nameOfType")
}

private AbstractClassName GetTypeByName(string nameOfType)
{
    switch(nameOfType)
    {
       case "type1":
           return new inheritedFromAbstractClass();
       case "type2":
           return new alsoInheritedFromAbstractClass();
       default:
           throw new Exception();
    }
}

我很遗憾地坚持使用VS2005的.NET 2.0项目,因此无法使用'var'关键字。任何人都可以就如何完成这样的事情或如何在.NET 2.0中完成任何建议。

所以,一个更真实的例子:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting order");
        Console.WriteLine("Press 1 or 2");
        string s = Console.ReadLine();
        var order = GetOrderByIdFromFactory(s);
        order.ShippingAddress = "My House, England";
        Console.WriteLine(order.Ship());
        Console.ReadKey();
    }

    private static OrderShipment GetOrderByIdFromFactory(string s)
    {
        OrderShipment os = default(OrderShipment);
        switch (s)
        {
            case "1":
                return new FedExShipping();
                break;
            case"2":
                return  new UpsShipping();
                break;
            default:
                throw new NotImplementedException("Not implemented");
        }
    }
}

我的抽象基类

public abstract class OrderShipment
{

    #region Properties
    public string ShippingAddress { get; set; }
    internal string Label { get; set; }
    private readonly TextWriter _text = new StringWriter();
    #endregion

    #region Public Methods

    internal string Ship ()
    {
        VerifyShippingData();
        GetShippingLabelFromCarrier();
        PrintLabel();
        return _text.ToString();
    }

    internal virtual void VerifyShippingData()
    {
        if (string.IsNullOrEmpty(ShippingAddress))
        {
            throw new ApplicationException("Invalid Address");
        }
    }

    internal abstract void GetShippingLabelFromCarrier();

    internal virtual void PrintLabel()
    {
        _text.Write(Label);
    }

    #endregion
}

我的2个继承类

public class FedExShipping : OrderShipment
{
    internal override void GetShippingLabelFromCarrier()
    {
        //ToDo perform logic
        Label = "FedEx Label Details";
    }
}

public class UpsShipping : OrderShipment
{
    internal override void GetShippingLabelFromCarrier()
    {
        //ToDo logic
        Label = "Ups Label Details";
    }
}

4 个答案:

答案 0 :(得分:3)

为什么不这样做?

AbstractClassName result = GetTypeByName("nameOfType")

var关键字不是创新,只是让你不输入 AbstractClassName(在这个具体的例子中)。因此,在这个具体的问题场景中,使用2.0

并没有太多松动

答案 1 :(得分:1)

Factory的概念是它隐藏了从系统中实例化抽象类的哪个子类型。这使您可以轻松切换(例如通过配置文件)应在整个系统中使用哪个子类。

但是,要使其工作,您的Factory应公开一个方法来构造抽象类的实例。我可能会改变你的代码:

private void methodName() 
{ 
    var result = GetTypeByName("nameOfType") 
} 

public AbstractClassName Create() 
{ 
    return GetTypeByName("nameOfType") 
} 

答案 2 :(得分:0)

为什么不使用

AbstractClassName result = GetTypeByName("nameOfType"); 

答案 3 :(得分:0)

private void methodName()
{
    AbstractClassName result = GetTypeByName("nameOfType")
}