对工厂方法设计模式的反思

时间:2013-04-23 12:41:29

标签: c# design-patterns

我找到的工厂方法模式的所有示例也是抽象工厂模式的示例。

见:

static void Main(string[] args) {
    IFactory factory = new ConcreteFactory();
    IProduct product = factory.CreateProduct(); // <== factory method pattern??
    ProcessProduct(product);

    Console.ReadKey();
}

我可以说这行代码:

IProduct product = factory.CreateProduct();

完全反映工厂方法模式的“精神”?

这里,工厂正在创建Product对象,而代码不知道特定对象的类型。

如果是这种情况,那么难怪为什么它们重叠,因为作者需要一种建立工作实例的方法。

我正在为我工​​作的公司制作定义词典。

2 个答案:

答案 0 :(得分:0)

在我的理解中,工厂方法也可以是类的实现的一部分,而不仅仅是工厂的实现。当您想要隐藏构造函数并使用方法时,这通常是有意义的:

class Foo{
private Foo(){
   //do something   
}

public static Foo createFoo(){
    //do something
    return new Foo();
}
}

答案 1 :(得分:0)

虽然您提供的示例在技术上是工厂方法,但它并不是非常有用。设计模式只有在简化目标应用程序/功能的开发时才有用。

通常,工厂方法实现的好处来自:

  1. 标准化对象的创建逻辑
  2. 为对象构建提供语义上有意义的界面
  3. 目前还不清楚如何不带参数的实例方法可能会比默认构造函数增加好处。

    看看C# example from the Wikipedia Factory Method article。 (复制+粘贴在下面)

    public class Complex
    {
        public double real;
        public double imaginary;
    
        public static Complex FromCartesianFactory(double real, double imaginary)
        {
            return new Complex(real, imaginary);
        }
    
        public static Complex FromPolarFactory(double modulus, double angle)
        {
            return new Complex(modulus * Math.Cos(angle), modulus * Math.Sin(angle));
        }
    
        private Complex(double real, double imaginary)
        {
            this.real = real;
            this.imaginary = imaginary;
        }
    }
    
    Complex product = Complex.FromPolarFactory(1, Math.PI);
    

    它非常有用,因为它指定了两个工厂方法,每个方法都有明确定义的参数,并且明确定义了如何使用这些参数构造定义良好的对象的有效实例。此外,构造函数是private,工厂方法是static,这可以确保构造该对象实例的唯一方法是使用工厂方法。虽然它不适用于此示例(因为所有可能的double参数值都有效),但将验证逻辑放在工厂方法或构造函数中也是有意义的。

    通常,工厂方法的目的是通过封装对象构造来降低代码复杂性,并且不清楚您提供的示例将如何实现该目标。