2013-03-27 55 views
2

我有一個工廠,可以建立許多類型的對象,它可能會增長。在工廠中使用反射

使用反射返回所有不同的類型而不是調用getPrototypes()方法中的每個方法是否是一個好主意?

它看起來像這樣與反思:

public final class ShapeFactory 
{ 
    private ShapeFactory(){} // no instance 

    public static Shape buildSquare() 
    { 
     return new Square(2); 
    } 

    public static Shape buildCircle() 
    { 
     return new Circle(2); 
    } 

    public static Shape buildTriangle() 
    { 
     return new Triangle(2, 2, 2); 
    } 

    // and many more shapes... 

    public static List<Shape> getPrototypes() 
    { 
     final List<Shape> prototypes = new ArrayList<>(); 

     // using reflection, call every build function 
     final Method[] methods = ShapeFactory.class.getMethods(); 
     for(final Method picked : methods) 
     { 
      if(picked.getReturnType() == Shape.class && picked.getParameterTypes().length == 0) 
      { 
       try 
       { 
        prototypes.add((Shape)picked.invoke(null)); 
       } 
       catch(final Exception e) 
       { 
        // this is an example, do not ignore 
        // exceptions in real code 
       } 
      } 
     } 

     return prototypes; 
    } 
} 

對不起,使用形狀的例子。

編輯:形狀是可複製的原型。 編輯#2:改善了這個例子,以防有人使用它。

+0

是的,很好的做法:http://www.codeproject.com/Articles/ 37547 /探索 - 工廠模式 在c# – zzfima 2013-03-27 16:20:06

+0

如果你能負擔得起反射的性能成本,那麼沒有理由不讓生活變得更簡單。但要確保成本是可以接受的。 – Thihara 2013-03-27 16:23:32

回答

0

使用反射返回所有不同類型而不是調用getPrototypes()方法中的每個方法是否是個好主意?

這是一件合理的事情。反射代碼更復雜且易碎,但這意味着當您添加新的形狀構建器方法時,不需要更改getPrototypes()。這取決於哪一個對你更重要。

但是,你不應該壓縮像你這樣做的例外。也許你應該更有選擇性地使用你創建原型的方法。 (當前版本將失敗,如果你添加一個返回Shape的方法,但需要參數...或者不是構建器。)

+0

是的,這只是爲了舉例。 – phil 2013-03-27 16:32:04

+0

我在關於忽略異常的示例中發出了警告。 – phil 2013-03-27 18:44:11

0

這實際上取決於您希望在編譯時完成類型檢查,還是希望以編譯時檢查爲代價來靈活地運行時檢測。

這兩個選項都是非常有效的方法。

+0

在這種情況下,我認爲反思會使它更加清潔和靈活。謝謝! – phil 2013-03-27 16:48:30