【问题标题】:Is this still a factory method?这仍然是工厂方法吗?
【发布时间】:2012-07-20 11:00:06
【问题描述】:

如果我不需要一个特殊的工厂类并且我想要一个具体的客户端来实例化正确的部分怎么办。客户端需要从该部分调用 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"); }
    }

}

【问题讨论】:

    标签: c# factory-method


    【解决方案1】:

    根据您需要实现的具体目标,您可能应该使用一些 for 依赖注入和您选择的 IoC 容器; StructureMap、Autofac、Unit、Ninject、Castle Windsor 都非常受欢迎。一旦你的 IoC 容器构建了具体的类,它应该支持这样的语法

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

    您可以在此处阅读有关如何使用 StructureMap 实现此目的的更多信息:Does an abstract class work with StructureMap like an interface does?

    【讨论】:

    • 我会研究 StructureMap 但我想知道我的实际问题的答案。最重要的是,它仍然是一个有效的工厂方法模式示例?
    【解决方案2】:

    据此: Differences between Abstract Factory Pattern and Factory Method 我在原始帖子中发布的代码似乎显示了对工厂方法模式的有效使用。关键是 - 工厂方法只是类的一个方法 - 它也可能是所创建对象的唯一客户端。

    或者换一种说法:工厂方法不需要公开,也不需要将创建的对象提供给外界。在我的示例中,应保护 Create() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      相关资源
      最近更新 更多