c# - 与工厂方法的定义混淆
问题描述
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
?
解决方案
这是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));
}
}
您可以在其中混合搭配CartesianFactory
with ,因为实际PolarFactory
的实例化被推迟到. Point
IPointFactory
这同样有效:
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
推荐阅读
- pandas - 如何通过请求模块提高获取请求内容的速度
- angular - 如何创建用于将数据从伪造查看器下载为 CSV 格式的按钮
- flutter - 寻找一个好的和简单的解决方案
- rabbitmq - RabbitMQ 消费者的订阅管理策略
- python - 如何在 forms.py 中为 django-ckeditor 启用图像上传选项
- laravel - Laravel 8:如何在现有数据库中检索一对一关系的数据?
- r - 带有子组的 Cox 比例风险模型的森林图
- html - 如何防止 tbody 与 tfoot 重叠
- python - 为什么 np.corrcoef 不能按预期使用两个二维向量?
- java - 如何在父类中指定的接口以外的接口中使用泛型?