Фабрика по сравнению с конструкторами экземпляра

Я не могу думать ни о каких причинах, почему каждый лучше, чем другой. Сравните эти две реализации:

public class MyClass
{
    public MyClass(string fileName)
    {
        // some code...
    }
}

в противоположность:

public class MyClass
{
    private MyClass(){}

    public static MyClass Create(string fileName)
    {
       // some code...
    }
}

Существуют некоторые места в платформе .NET, которые используют статический метод создать экземпляры. Сначала я думал, это регистрируется, это - экземпляры для отслеживания их, но постоянные конструкторы могли сделать то же самое с помощью частных статических переменных.

Каково обоснование позади этого стиля?

39
задан Neil N 5 August 2010 в 04:53
поделиться

6 ответов

Примечание. У вас есть не статический конструктор, это статическая функция, которая создает экземпляр, а не вызывает экземпляр. конструктор самостоятельно. Статический конструктор - это совсем другое дело.

Фабричный шаблон - классический пример использования функции (статической или нет) для создания экземпляра типа вместо прямого использования конструктора. Обратите внимание, что фактический конструктор экземпляра будет вызван несмотря ни на что, но статическая функция обеспечивает уровень косвенного обращения, который позволяет ей возвращать экземпляр любого типа, который либо является типом возвращаемого значения, либо наследуется от него, а не только экземпляры, которые являются возвращаемым типом.

Например:

public abstract class BaseClass
{
    public static BaseClass Create(int parameter)
    {
        if (parameter == 1)
        {
            return new Class1();
        }
        else
        {
            return new Class2();
        }
    }
}

internal class Class1 : BaseClass
{
    //code here ...
}

internal class Class2 : BaseClass
{
    //code here ...
}

Это позволяет скрыть Class1 и Class2 от внешних сборок, в то же время позволяя потребителю иметь дело с чем-то специализированным.

51
ответ дан 27 November 2019 в 02:19
поделиться

Статический метод Create может создавать и возвращать:

  • A MyClass экземпляр
  • Экземпляр любого подкласса of MyClass
  • null
7
ответ дан 27 November 2019 в 02:19
поделиться

Заводской метод часто используется, чтобы скрыть точный тип создаваемого объекта. Абстрактный класс может иметь статический фабричный метод, который затем выбирает конкретный производный класс для создания экземпляра в зависимости от некоторого условия. Публично документирован только абстрактный базовый класс. Это оставляет поставщику библиотеки некоторую свободу изменять точный экземпляр создаваемого типа без нарушения существующего кода.

Примером из .NET framework являются статические фабричные методы в классе Expression .

3
ответ дан 27 November 2019 в 02:19
поделиться

Как видите, myClass не следует «классическому» шаблону фабрики (где класс экземпляра не известен / не предоставляется за пределами фабрики).

Однако в этом случае команда разработчиков .NET Framework может не стремиться к фабричному шаблону, но я думаю, они не хотят, чтобы вы просто обновляли целевой класс напрямую с именем файла через конструктор. Фабрика может быть излишней, если предоставляется только этот класс.

Этот шаблон иногда можно увидеть в методах clone (), где объект может возвращать экземпляр, который является своего рода дубликатом самого себя.

Также может быть, хотя класс является общедоступным, они могут захотеть выполнить некоторые проверки с экземпляром, именем файла и т. Д., И если они реализовали фабрику, целевой класс все равно может быть создан и вызван, минуя проверки.

1
ответ дан 27 November 2019 в 02:19
поделиться

Иногда важно вести бухгалтерский учет и/или управлять ресурсами для каждого созданного экземпляра класса. В результате важно, чтобы каждая конструкция управлялась глобально, и статический метод для выполнения конструкции прекрасно справится с этой задачей.

1
ответ дан 27 November 2019 в 02:19
поделиться

Вы можете каррировать фабричные методы. Попытка карри конструктора дает вам: фабричный метод.

Я использую это в моем коде, который перечисляет дерево диспетчера устройств Windows.Один из классов перечисляет последовательные порты, каждый последовательный порт имеет свойство фабрики соединений, которое возвращает каррированный фабричный метод с адресом порта (действительно уродливой строкой устройства PNP), хранящимся во внутреннем состоянии, в то время как скорость передачи, стоповые биты, четность - все это предоставляется позже.

0
ответ дан 27 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: