我正在尝试实施工厂。据我了解,以下简单代码是工厂(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";
}
}
答案 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")
}