2015-11-03 61 views
2

我有以下類和結構(簡本)創建子類對象:如何在超視construtor參數在運行時(在Java中)

public abstract class AbstractGeoObj { 
    private Point position; 
    ... 
    public abstract calcArea(); 
    public abstract calcPerimeter(); 
    ... 
    some getter 
    ... 
    some setter 
    ... 
} 

public class Polygon extends AbstractGeoObj implements InterfaceMove { 

    private LinkedList<Point> edges; 

    public Polygon(LinkedList<Point> points) { 
     //here i want to check the conditions and create the right Object 
     //but i think this is the wrong way to do it 
    } 
    ... 

    private boolean isSquare(List<Points> points) { ... } 

    private boolean isRectangle(List<Points> points) { ... } 

    private boolean isRotated(List<Points> points) { ... } 

} 

public class Rectangle extends Polygon implements InterfaceMove { 

    public Rectangle(Point a, Point b, Point c, Point d) {} 
    public Rectangle(Point[] points) { this(...) } 
    public Rectangle(LinkedList<Piont> points) { this(...) } 

    ... 
} 

public class Square extends Polygon implements InterfaceMove { 

    public Square(Point a, Point b, Point c, Point d) {} 
    public Square(Point[] points) { this(...) } 
    public Square(LinkedList<Piont> points) { this(...) } 

    ... 
} 

現在的問題是,我需要創建用Polygon-Object,Rectangle-Object或Square-Object,取決於構造函數參數以及運行時isSquare(),isRectangle()和isRotated()方法的結果,程序應自動選擇應創建哪個對象。例如,如果給定的4個點導致isSquare = true並且isRotated()= false,我想創建Square對象,如果isRotated()= true,我將創建多邊形對象。

我研究了關於建造者模式和工廠模式,但我不明白,所以我could'nt實現它爲我的問題,我不知道是否有對我來說是更好的解決方案。一些正確的方向和示例的建議或提示可能對我有很大的幫助。我希望你明白我的問題。

我知道,長方形和正方形的構造基本上是相同的,但在這裏,那不是話題,以後我會解決它。 ;)

這裏是一個UML圖向你展示當前的結構,其在德國,所以我翻譯的重要組成部分你。 (它不是最終的,我可能會改變它): UML Diagram PNG

感謝您的幫助提前。

回答

3

這是錯誤的,我想用一個工廠將是最好的方式(https://en.wikipedia.org/wiki/Factory_method_pattern)這樣,你去一個更面向對象的方法,因爲構造函數的作用不是確定要創建什麼樣的對象,其作用是創建它應該構造的對象。

創建一個類:

class ShapeFactory{ 
    public static SuperClass getShape(params...){ 
     if(cond1){return new WhateverSubClass1;} 
     else if(cond2){return new WhateverSubClass2;} 
     ... (etc for all subclass cases) 
    } 
} 

編輯: 遠程引用: http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm

+0

好吧,我tryed它,看起來是爲我工作。 我應該將我的解決方案添加到我的問題嗎? – Rep

+0

這很好,不要忘記選擇最佳答案作爲「答案」,以便其他人可以從這篇文章中獲得幫助。不,您不需要發佈解決方案,只需標記最佳答案:)(在選票下面有一張支票) –

1

據我所知你基本上總是一個多邊形對象,所以你可以使用一個工廠爲你創建一個多邊形對象。要檢查您必須使用哪種類型,可以使Polygon類中的方法(isSquare,isRectangle和isRotated)爲靜態。隨後,工廠使用的具體實施多邊形來創建多邊形對象:

class PolygonFactory(List<Point> points) 
{ 

    public static Polygon createPolygon(List<Point> points) 
    { 
    if(Polygon.isSquare(points) 
     return new Square(points); 
    if(Polygon.isRectangle(points) 
     return new Rectangle(points); 

    return new Polygon(points); 
    } 
} 
相關問題