这仍然是工厂方法吗?

时间:2012-07-21 11:16:30

标签: c# factory-method

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

}

2 个答案:

答案 0 :(得分:0)

根据您需要实现的目标,您可能应该使用一些用于您选择的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?

答案 1 :(得分:0)

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

或者以另一种方式:工厂方法不需要公开,并将创建的对象提供给外部世界。在我的例子中,应该保护Create()方法。