2

我发现的所有工厂方法模式的例子也是抽象工厂模式的例子。

看到这个:

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 对象。

如果是这样,那么难怪它们为什么会重叠,因为作者需要一种构建工作示例的方法。

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

4

2 回答 2

0

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

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

  1. 标准化对象的创建逻辑
  2. 为对象构造提供语义上有意义的接口

目前尚不清楚不带参数的实例方法如何可能比默认构造函数增加好处。

查看Wikipedia Factory Method 文章中的 C# 示例。(复制+粘贴在下面)

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);

它很有用,因为它指定了两个工厂方法,每个方法都有明确定义的参数,以及对如何使用这些参数来构造定义明确的对象的有效实例的明确解释。此外,构造函数 isprivate和工厂方法 is static,这确保构造该对象的实例的唯一方法是使用工厂方法。虽然它并不特别适用于这个例子(因为所有可能的double参数值都是有效的),但将验证逻辑也放在工厂方法或构造函数中是有意义的。

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

于 2013-04-29T15:34:49.620 回答
0

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

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

public static Foo createFoo(){
    //do something
    return new Foo();
}
}
于 2013-04-29T13:55:35.513 回答