2016-04-09 13 views
0

Ich frage mich, ob dies eine gültige Praxis von Design-Mustern ist. Ich entwerfe gerade einen Code, wo es scheint, dass es einen Hersteller in der Fabrik gibt. Ich kann etwas Schlechtes in meinem aktuellen Design riechen, aber ich kann es nicht genau bestimmen. Der Code sieht so etwas wie diese ...Design Patterns: Builder in einer Fabrik

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; 
    } 
} 

Antwort

1

Das Problem mit dem Ansatz ist, dass es keine jede Flexibilität in das Objekt IProduct Gebäude, alle Objekte in der gleichen Art und Weise gebaut werden, so dass, wenn morgen ein Objekt Notwendigkeit auf eine andere Art erschaffen werden. Sie werden schwere Veränderungen vornehmen müssen. Was würde ich vorschlagen, ist eine Factory-Methode innerhalb der Klasse Builder, wie

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(); 
    } 
} 

Bei diesem Ansatz folgt können Sie unabhängig mehr Produkttypen hinzufügen (in der Fabrik-Methode) und bauen Sie Ihr Objekt Schritt für Schritt mit mehr Teilen :)

+0

+1 schön. Es ist wahr, dass meine aktuellen Produkte auf die gleiche Art und Weise gebaut werden und Ihr Ansatz würde es flexibler machen. Ich werde versuchen, meinen Code zu refaktorieren und werde die Ergebnisse darüber berichten, wie er aussieht. :) –

+0

habe gerade deinen Ansatz für meinen Code implementiert. sieht großartig aus! Vielen Dank! die einzige Frage, die ich habe, ist, wenn es immer noch notwendig ist, die Fabrikklasse im Builder zu erstellen? Ich habe nur die GetNewProduct-Methode in die Builder-Klasse eingefügt, anstatt eine verschachtelte Factory zu erstellen. –

+0

Nehmen wir an, ProductA muss nur Part1 haben, daher ist es sinnvoll, AddPart1() in der ProductA-Klasse zu implementieren ... aber ProductB hat ein Part2, da beide das Product Interface gemeinsam nutzen. Beide müssen AddPart2() implementieren. Ich war gezwungen, ProductA AddPart1() ohne irgendwelche Codezeilen zu implementieren .. (dh nur {}) –

Verwandte Themen