2017-10-08 63 views
0

我正在學習設計模式並在HERE中遇到非常奇怪的示例。如果我們有一個類:抽象工廠模式 - 未使用的代碼

public abstract class AbstractFactory { 
abstract Color getColor(String color); 
abstract Shape getShape(String shape) ; 
} 

正如我們可以看到的,有2種類型的方法創建對象:顏色和形狀。這是一個抽象類,所以我們必須建立具體落實這一點,所以讓我們假設我們有:

public class ShapeFactory extends AbstractFactory { 

@Override 
public Shape getShape(String shapeType){ 

// I skip implementation to keep post brief 

} 

@Override 
Color getColor(String color) { 
    return null; // It's useless method in this class! 
} 
} 

和第二實施:

public class ColorFactory extends AbstractFactory { 

@Override 
public Shape getShape(String shapeType){ 
    return null; // It's useless method in this class! 
} 

@Override 
Color getColor(String color) { 

// I skip implementation to keep post brief 

} 
} 

在這裏,我的問題是,在這兩種情況下(具體工廠)有一種完全沒用的方法,並且不存在,但是當我們創建AbstractFactory類時,我們必須實現這兩種方法。在編程中在不需要它的類中創建無用方法不是不好的習慣嗎?應該以其他方式完成,而不是像網站建議的那樣?

+0

你是在問,什麼辦法可以跳過覆蓋方法之一嗎? – Ravi

+0

該教程根本沒有意義。你很困惑。 –

+0

有些時候是的。我很困惑becouse模式應該使代碼更加相關,但在這種情況下,對我來說好像是遠離良好的實踐。那麼你打算在這段代碼中改變什麼呢? – Michael213

回答

2

@ Michael213 - 您的具體實現不正確。當然,他們不遵循抽象工廠模式。抽象工廠談論產品的家庭。抽象工廠樣本(使用我的假設)看起來像下面的代碼。你的例子只使用一種方法將被濫用模式,並很快就會中斷。

我已經回答類似的問題,請看看到也What are the real benefits of using the Abstract Factory in the following example, instead of the factory method?

public abstract class AbstractFactory { 
     abstract Color getColor(String color); 
     abstract Shape getShape(String shape) ; 
    } 
    /** 
    * CONCRETE FACTORY1 
    */ 
    class HighResolutionFactory extends AbstractFactory{ 
     Color getColor(String color){ 
      return new HighResolutionColor(); 
     } 
     Shape getShape(String shape){ 
      return new HighResolutionShape(); 
     } 
    } 

    /** 
    * CONCRETE FACTORY2 
    */ 
    class LowResolutionFactory extends AbstractFactory{ 
     Color getColor(String color){ 
      return new LowResolutionColor(); 
     } 
     Shape getShape(String shape){ 
      return new LowResolutionShape(); 
     } 
    } 
    class Color{} // ABSTRACT PRODUCT 1 
    class Shape{} // ABSTRACT PRODUCT 2 
    class HighResolutionColor extends Color{}// CONCRETE PRODUCT1 FACT 1 
    class HighResolutionShape extends Shape{}// CONCRETE PRODUCT2 FACT 1 
    class LowResolutionColor extends Color{}//... 
    class LowResolutionShape extends Shape{} 
0

是的,該教程似乎並不是最好的方面。 雖然它仍然被視爲工廠設計模式,但並不理想。

0

AbstractFactory錯誤。你不必考慮製造不同物體的工廠。爲每種不同的類型製造單獨的工廠是正確的。

public interface AbstractColorFactory { 
    public Color getColor(String color); 
} 

public interface AbstractShapeFactory { 
    public Shape getShape(String shape); 
} 

public class ColorFactory implements AbstractColorFactory { 
    public Color getColor(String color) { 
     return .... 
    } 
} 

public class ShapeFactory implements AbstractShapeFactory { 
    public Shape getShape(String shape) { 
     return .... 
    } 
} 
+0

找到一個更好的示例是的,但是在這些方法中,我們只做普通工廠模式!我們只添加其他抽象類 – Michael213

+0

當您重用邏輯時使用抽象類。在這種情況下,不會重用邏輯,所以最好使用接口而不是抽象類。 您應該記住'Color'和'Shape'也應該是接口(或抽象類)。如果有特定的實例,最好使用靜態方法'Color.newInstance(String)'和'Shape.newInstance(String)'工廠。 但是,你自己注意到在你的版本中你必須執行你永遠不會使用的方法。 –