Я не вижу ничего плохого в интерфейсе вашего конструктора и не вижу, что даст вам статический метод.У меня будут точно такие же параметры, верно?
Параметры не кажутся необязательными, поэтому нет способа обеспечить перегрузку с меньшим количеством или использовать дополнительные параметры.
ИзС точки зрения вызывающего, это выглядит примерно так:
Movie m = new Movie("Inception", 2010, Genre.Drama, 150, actors);
Цель фабрики - предоставить вам настраиваемый конкретный экземпляр интерфейса, а не просто вызвать конструктор для вас.Идея состоит в том, что точный класс не является жестко закодированным в точке построения.Это действительно лучше?
Movie m = Movie.Create("Inception", 2010, Genre.Drama, 150, actors);
Мне кажется, почти то же самое.Единственное, что будет лучше, это если Create()
вернет другие конкретные классы, чем Movie
.
Одна вещь, о которой стоит подумать, - это как улучшить это, чтобы вызывать код, который легко понять.Самая очевидная проблема для меня заключается в том, что не очевидно, что означает 150, не глядя на код для Movie
.Есть несколько способов улучшить это, если вы хотите:
- Использовать тип для длины фильма и создать этот тип inline new MovieLength (150)
- Использовать именованные параметрыесли вы используете .NET 4.0
- (см. ответ @ Heinzi), используйте инициализаторы объектов
- Используйте свободный интерфейс
При свободном интерфейсе ваш вызов будет выглядеть так:
Movie m = new Movie("Inception").
MadeIn(2010).
InGenre(Genre.Drama).
WithRuntimeLength(150).
WithActors(actors);
Честно говоря, все это кажется излишним для вашего случая.Именованные параметры разумны, если вы используете .NET 4.0, потому что они не намного больше кода и улучшат код у вызывающей стороны.