2016-04-09 11 views
0

Мне интересно, является ли это правильной практикой шаблонов проектирования. В настоящее время я разрабатываю код, в котором, по-видимому, есть строитель на заводе. В моем текущем дизайне я чувствую что-то плохое, но я не могу его точно определить. Код выглядит примерно так ...Шаблоны проектирования: строитель на заводе

class Program 
{ 
    static void Main() 
    { 
     string productName = "productA"; 
     IProduct product1 = new Factory().GetNewProduct(productName); 
    } 
} 

class Factory 
{ 
    internal IProduct GetNewProduct(string name) 
    { 
     IProduct product = null; 

     switch (name) 
     { 
      case "productA": 
       product = new ProductA(); 
       break; 
      case "productB": 
       product = new ProductB(); 
       break; 
      case "productC": 
       product = new ProductC(); 
       break; 
      default: 
       throw new Exception("Invalid product type!"); 
     } 

     //builder (sort of)    
     product.addPart1(); 
     product.addPart2(); 
     ... 

     return product; 
    } 
} 

ответ

1

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

class Builder { 

    IProduct product; 

    public Builder(String type) { 

     product = new Factory().getNewProduct(type); 
    } 

    public Builder addPart1() { 

     product.addPart1(); 
     return this; 
    } 

    public Builder addPart2() { 

     product.addPart2(); 
     return this; 
    } 

    public void build() { 

     return product; 
    } 


    private class Factory { 

     IProduct GetNewProduct(string name) { 
      IProduct product = null; 

      switch (name) 
      { 
       case "productA": 
        product = new ProductA(); 
        break; 
       case "productB": 
        product = new ProductB(); 
        break; 
       case "productC": 
        product = new ProductC(); 
        break; 
       default: 
        throw new Exception("Invalid product type!"); 
      } 

      return product; 
     } 
    } 
} 

class Program { 
    static void Main() 
    { 
     String productName = "productA"; 
     IProduct product1 = new Builder(productName) 
          .addPart1() 
          .addPart2() 
          .build(); 
    } 
} 

При таком подходе вы можете самостоятельно добавить больше видов продукции (в методе Factory) и построить свой шаг за шагом объект с большим количеством деталей :)

+0

+1 хорошо. это правда, что мои текущие продукты построены одинаково, и ваш подход сделает его более гибким. Я постараюсь реорганизовать мой код и будет отзывать результаты о том, как он выглядит. :) –

+0

только что реализовал ваш подход к моему коду. выглядит отлично! Большое спасибо! Единственный вопрос, который у меня есть, - это если необходимо создать фабричный класс внутри строителя? Я только что включил метод GetNewProduct в класс builder вместо создания вложенной фабрики. –

+0

Кроме того, предположим, что ProductA должен иметь Part1, поэтому разумно реализовать AddPart1() в классе ProductA ... но сказать, что ProductB имеет Part2, поскольку оба они совместно используют интерфейс продукта, им необходимо реализовать AddPart2(). Я был вынужден реализовать ProductA AddPart1() без каких-либо строк кода .. (т.е. только {}) –