Зачем использовать метод Create вместо использования «new»? - PullRequest
11 голосов
/ 18 мая 2009

Каковы преимущества и когда целесообразно использовать статический конструктор?

public class MyClass
{
    protected MyClass()
    {
    }

    public static MyClass Create()
    {
        return new MyClass();
    }
}

и затем создание экземпляра класса с помощью

MyClass myClass = MyClass.Create();

, а не просто открытый конструктор и создание объектов с использованием

MyClass myClass = new MyClass();

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

Ответы [ 17 ]

1 голос
/ 18 мая 2009

Помимо того, что это одноэлементный объект, использование "статического метода фабрики", такого как MyClass.Create, может быть полезно, если человек, который реализует MyClass.Create, может захотеть вернуть подкласс MyClass ... например, во время тестирования он может возвратить экземпляр подкласса MyClassWithExtraTestingFunctionality ... или, в зависимости от параметра конфигурации, экземпляр подкласса MyClassBeingRemotedOverTheNetwork ...

1 голос
/ 18 мая 2009

Это хороший способ заставить MyClass быть финальным, если вы используете приватный конструктор. Таким образом, подклассы не могут быть созданы, потому что их конструктор не может получить доступ к конструктору супер.

Еще одним преимуществом является наличие одного параметра для конструктора. Затем вы можете назвать создание с эмуляцией именованных аргументов:

public static MyClass createWithDays(int days) {
...
}

Теперь сравните new MyClass(5) с MyClass.createWithDays(5)

1 голос
/ 18 мая 2009

Этот подход только обычно используется для синглетонов, в противном случае этот подход неортодоксален Не используйте, пока не поймете, что он пытается сделать.

1 голос
/ 18 мая 2009

Этот шаблон обычно используется в шаблоне Singleton . Это полезно, когда у вас есть класс или фасад для класса, который должен создаваться только один раз в течение жизни программы, обычно из-за ресурсов, которые будет использовать объект.

Как в C #

0 голосов
/ 18 мая 2009

Также это может быть использовано в случае отложенной загрузки. Где вы хотите, чтобы объект был по какой-то причине, но не хотите делать всю тяжелую работу, связанную с настоящим конструктором, если это не нужно. Таким образом, вы создаете отдельный метод Create и вызываете его, когда будете готовы к тяжелой работе.

Также @Rashmi Pandit писал:

   public static User CreateByCredentials(string uid, string pwd)
    {
       ....
    }

    public static User CreateById(int id)
    {
    ...
    }

К вашему ответу, вы не можете просто использовать перегруженные конструкторы с разными сигнатурами методов вместо создания двух разных методов создания?

0 голосов
/ 18 мая 2009

Обратите внимание, что вы можете использовать инициализаторы конструктора только при использовании подхода конструктора.

    public void Example()
    {
        var person = new Person
                         {
                             GivenName = "John",
                             FamilyName = "Smith",
                             Address = new Address
                                           {
                                               Street = "Wallace",
                                               Number = 12
                                           },
                             PhoneNumbers = new List<PhoneNumber>
                                                {
                                                    new PhoneNumber
                                                        {
                                                            Number = 1234234,
                                                            AreaCode = 02
                                                        },
                                                    new PhoneNumber
                                                        {
                                                            Number = 1234234, AreaCode = 02
                                                        }
                                                }
                         };
    }

    internal class PhoneNumber
    {
        public int AreaCode { get; set; }

        public int Number { get; set; }
    }

    internal class Address
    {
        public int Number { get; set; }

        public string Street { get; set; }
    }

    internal class Person
    {
        public Address Address { get; set; }

        public string GivenName { get; set; }

        public string FamilyName { get; set; }

        public List<PhoneNumber> PhoneNumbers { get; set; }
    }
}
0 голосов
/ 18 мая 2009

Это также обычно используется, когда вы хотите, чтобы инфраструктура, класс или другая конфигурация определяли, ГДЕ объект будет фактически создан. Когда вы используете новый подход конструктора, он создается локально. Если вы используете этот подход, он потенциально может быть создан удаленно через сервисный вызов и возвращен и т. Д. Это подход, принятый Роки Лхоткой в ​​ CSLA framework .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...