0

我正在尝试实现一个工厂。据我了解,以下简单代码是工厂(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

4 回答 4

3

为什么不这样:

AbstractClassName result = GetTypeByName("nameOfType")

var关键字不是创新,它只是让你不要输入 AbstractClassName(在这个具体例子中)。所以在这个具体的问题场景中,你不会放松太多使用2.0

于 2012-09-20T08:50:13.037 回答
1

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

然而,为了使这个工作你的工厂应该公开一个方法来构造抽象类的一个实例。我可能会更改您的代码:

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

public AbstractClassName Create() 
{ 
    return GetTypeByName("nameOfType") 
} 
于 2012-09-20T08:57:41.167 回答
0

为什么不使用

AbstractClassName result = GetTypeByName("nameOfType"); 

?

于 2012-09-20T08:50:54.883 回答
0
private void methodName()
{
    AbstractClassName result = GetTypeByName("nameOfType")
}
于 2012-09-20T08:52:19.647 回答