путать с определением фабричных методов - PullRequest
0 голосов
/ 06 января 2020

Определение GoF определяет шаблон Factory Method как «позволяет классу откладывать создание экземпляров для подклассов». Я понял идею, но я также использую шаблон, как показано ниже:

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 класс?

1 Ответ

0 голосов
/ 06 января 2020

Это удобный способ создания двух различных типов Point с помощью методов stati c, когда значащие имена [этих методов] помогают коду самодокументироваться. Они оба создают экземпляры Point, поэтому вы можете свободно именовать их как "фабричные методы".

Но они не Шаблон «Factory Method» 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 с 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

...