2012-07-21 55 views
0

如果我不需要特殊的工廠類,並且我想要一個具體的客戶端實例化正確的零件,該怎麼辦。客戶端需要從該部分調用Hello()。其他地方的重點是使工廠方法成爲特殊創建者類的一種方法。但是這裏馬上就在客戶端。這仍然是一個工廠方法模式,它是正確的使用它如下所示?這仍然是一種工廠方法嗎?

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AClient c1 = new ClientUsingPart1(); 
      c1.Foo(); 
      AClient c2 = new ClientUsingPart2(); 
      c2.Foo(); 
      Console.ReadKey(); 
     } 
    } 

    abstract class AClient 
    { 
     public AClient() { this.ipart = Create(); } 

     public void Foo() { ipart.Hello(); } 
     // many other methods 
     // ... 
     public abstract IPart Create(); // factory method 
     IPart ipart; 
    } 

    class ClientUsingPart1 : AClient 
    { 
     public override IPart Create() { return new Part1(); } 
    } 

    class ClientUsingPart2 : AClient 
    { 
     public override IPart Create() { return new Part2(); } 
    } 

    interface IPart 
    { 
     void Hello(); 
    } 

    class Part1 : IPart 
    { 
     public void Hello() { Console.WriteLine("hello from part1"); } 
    } 
    class Part2 : IPart 
    { 
     public void Hello() { Console.WriteLine("hello from part2"); } 
    } 

} 

回答

0

根據此: Differences between Abstract Factory Pattern and Factory Method 似乎我在原帖中發佈的代碼顯示了工廠方法模式的有效使用。關鍵是 - 工廠方法是只是類的方法 - 它也可能是創建對象的唯一客戶端。

或者以另一種方式:工廠方法不需要公開並將創建的對象提供給外部世界的。在我的例子中,Create()方法應該受到保護。

0

取決於你需要達到什麼你可能應該使用一些依賴注入與你選擇的IoC容器;與StructureMap,Autofac,Unit,Ninject,溫莎城堡都非常受歡迎。一旦你的IoC容器已建成的具體類就應該支持這樣的

foreach (var client in Container.Resolve<IEnumerable<AClient>>()) 
{ 
    client.Create(); 
} 

一個語法,你可以閱讀更多關於如何與StructureMap這裏實現這一點:Does an abstract class work with StructureMap like an interface does?

+0

我會看看StructureMap,但我想知道我的實際問題的答案。最重要的是它仍然是一個有效的工廠方法模式示例? – Firkraag 2012-07-21 12:57:40

相關問題