首页 > 解决方案 > 与工厂方法的定义混淆

问题描述

GoF 定义将工厂方法模式定义为“让类将实例化推迟到子类”。我明白了,但我也有如下模式:

public class Point
{
    private double x, y;

    protected Point(double x, double y)
    {
        this.x = x;
        this.y = y;
    }
    public static Point NewCartesianPoint(double x, double y)
    {
        return new Point(x, y);
    }
    public static Point NewPolarPoint(double rho, double theta)
    {
        return new Point(rho * Math.Cos(theta), rho * Math.Sin(theta));
    }
}

我知道使用这种模式的好处,但作者说NewCartesianPoint并且NewPolarPoint也是工厂方法。

我在这里有点困惑,以下是我的问题:

Q1-甚至没有从Point这里派生的子类,为什么它们是工厂方法?

Q2-如果还有工厂方法,那么这里的工厂是什么?上课Point

标签: c#design-patternsfactory-method

解决方案


这是Point使用静态方法创建两种不同类型的便捷方式,为 [那些方法] 赋予有意义的名称有助于代码自记录。它们都构造了的实例,Point因此您可以将它们松散地称为“工厂方法”。

但它们不是GoF“工厂方法”模式,其定义为:

定义一个用于创建对象的接口,但让子类决定要实例化哪个类。Factory 方法允许类将其使用的实例化推迟到子类。

使用工厂方法模式的重点是允许您编写诸如

public abstract class Shape
{
    protected List<IPointFactory> points = new List<IPointFactory>();

    public IEnumerable<Point> GetPoints() => points.Select(p => p.CreatePoint()); 

}

public class Square : Shape
{
    public Square()
    {
        points.Add(new CartesianFactory(0.0,0.0));
        points.Add(new CartesianFactory(1.0,0.0));
        points.Add(new CartesianFactory(0.0,1.0));
        points.Add(new CartesianFactory(1.0,1.0));
    }
}

您可以在其中混合搭配CartesianFactorywith ,因为实际PolarFactory的实例化被推迟到. PointIPointFactory

这同样有效:

public class SomeShape : Shape
{
    points.Add(new CartesianFactory(0.0,0.0));
    points.Add(new PolarFactory(10,10));
    points.Add(new CartesianFactory(0.0,1.0));
}

您可以在此处查看完整代码:https ://dotnetfiddle.net/DhdykW


推荐阅读