2012-07-21 37 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

相关问题