2013-09-03 4 views
0

У меня есть существующий базовый код, который использует статический Factory Method дизайн для инстанцирования определенных типов объектов:Расширение статического шаблона метода завода

public static Something createSomething(int x, int y, .....) 
{ 
    // creates a Something object 
} 

Я хотел бы продлить этот метод позволяет ему инициализировать объект Something по-другому, основываясь на новых параметрах (параметрах), которые будут определять способ создания объекта.

Простейший (и наименее масштабируемый) способ заключается в добавлении новых параметров к заводскому методу.

Это не похоже на правильный путь для ведения дел:

  1. Там больше, чем один фабричный метод, который должен быть обновлен, а не только один.
  2. Создание нового метода приведет к изменению кода клиента, вызывающего фабрику. Этот вид побеждает цель создания единого места, которое генерирует объекты.
  3. Добавление большего количества параметров приводит к длинным спискам параметров, которые непросто использовать.

Есть ли лучший подход к расширению заводского метода?

+0

Используйте шаблон Builder. –

+0

заботиться о том, чтобы разработать (хотя бы кратко), как это соответствует требованиям и позволяет расширить текущий дизайн? –

+0

Это не расширило бы его. Вам нужно будет изменить текущий проект, чтобы использовать объект Builder вместо Factory. Самый простой способ - просто добавить новый метод с дополнительным параметром. –

ответ

2

Создайте новый метод и используйте объект параметра в качестве аргумента (Is this a named pattern?). Таким образом, вы не изменяете предыдущую реализацию, и вы открыты для любой новой реализации (вы меняете объект параметра, не затрагивая существующие вызовы в данный метод).

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

public static Something createSomething(int x, int y, .....) 
{ 
    /// 1. Implementation 
    /// OR 
    /// 2. return createSomething(new SomethingDescription(parameters ...)); 
} 

public static Something createSomething(SomethingDescription description) 
{ 
    /// 1. return createSomething(description.x, description.y, ...); 
    /// OR 
    /// 2. Implementation 
} 

Но если объект действительно сложный, и может быть строить в много способов, вы должны переключиться на шаблон Builder, как это предлагает Сотириос Делиманолис.

Смежные вопросы