這裏的示例代碼我工作的時候丹尼爾張貼了他的答案。它看起來像它在做什麼,他建議:
public static class BaseFactory
{
public static Base Create(bool condition)
{
if (condition)
{
return Derived1.Create(1, "TEST");
}
else
{
return Derived2.Create(1, DateTime.Now);
}
}
}
public class Base
{
protected Base(int value)
{
}
protected static Base Create(int value)
{
return new Base(value);
}
}
public sealed class Derived1: Base
{
private Derived1(int value, string text): base(value)
{
}
internal static Derived1 Create(int value, string text)
{
return new Derived1(value, text);
}
}
public sealed class Derived2: Base
{
private Derived2(int value, DateTime time): base(value)
{
}
internal static Derived2 Create(int value, DateTime time)
{
return new Derived2(value, time);
}
}
[編輯],丹尼爾的第二個建議:
public static class BaseFactory
{
public static Base Create(bool condition)
{
if (condition)
{
return new Derived1Creator(1, "TEST");
}
else
{
return new Derived2Creator(1, DateTime.Now);
}
}
private sealed class Derived1Creator: Derived1
{
public Derived1Creator(int value, string text): base(value, text)
{
}
}
private sealed class Derived2Creator: Derived2
{
public Derived2Creator(int value, DateTime time): base(value, time)
{
}
}
}
public class Base
{
protected Base(int value)
{
}
protected static Base Create(int value)
{
return new Base(value);
}
}
public class Derived1: Base
{
protected Derived1(int value, string text): base(value)
{
}
protected static Derived1 Create(int value, string text)
{
return new Derived1(value, text);
}
}
public class Derived2: Base
{
protected Derived2(int value, DateTime time): base(value)
{
}
protected static Derived2 Create(int value, DateTime time)
{
return new Derived2(value, time);
}
}
注意這第二種方法意味着,類不能被密封,很遺憾。
丹尼爾和馬修。真的很聰明。它工作並滿足所有要求。我喜歡。我只是不知道誰的答案是接受的:-) – Dave 2013-02-20 12:36:16
馬修,第一個代碼並不是我的第一個選項。正如我所說,使*構造函數*'內部'。使用其他工廠方法繞道不會帶來任何好處。 – 2013-02-20 12:40:01
贊成。這只是爲了演示如何使用工廠方法 - 儘管工廠方法在這種情況下非常簡單,以至於它不會隱藏任何東西。在一般情況下,它可以。 – 2013-02-20 12:58:09