2010-05-31 131 views
0

我是新來的設計模式,我在這裏有一個場景。我不確定如何實施該模式。如何應用抽象工廠模式?

  1. 我們有多個供應商飛利浦,賣onida等
  2. 每個供應商(飛利浦,賣onida等)可以具有不同類型的產品即血漿或標準電視的。

我想要使用抽象工廠模式的每個供應商的特定產品。

我實施至今:

public enum TvType 
{ 
    Samsung = 0, LG = 1, Philips = 2, Sony = 3 
} 

public enum Product 
{ 
    Plasma = 0, NormalTV = 1 
} 

混凝土類返回包含每一個產品,也是接口的每個供應商的ProductInfo也就是說,如果賣方爲那麼它必須有產品。

回答

0

僞代碼可能是這樣的:

interface TvFactory { 
    NormalTelevision createNormalTv(); 
    PlasmaTelevision createPlasmaTv(); 
} 

class PhilipsTvFactory implements TvFactory { 
    public NormalTelevision createNormalTv() { 
    return new PhilipsNormalTelevision(); 
    } 
    public PlasmaTelevision createPlasmaTv() { 
    return new PhilipsPlasmaTelevision(); 
    } 
} 

class OnidaTvFactory implements TvFactory { 
    public NormalTelevision createNormalTv() { 
    return new OnidaNormalTelevision(); 
    } 
    public PlasmaTelevision createPlasmaTv() { 
    return new OnidaPlasmaTelevision(); 
    } 
} 

// similarly for other vendors... 

... 
// decides - maybe based on config - which factory to use 
TvFactory factory = loadTvFactory(); 
Television myTv = factory.createPlasmaTv(); 
+0

在決定使用哪個工廠方面,使課堂需要使用工廠抽象,擴展類提供工廠,然後通過對其抽象getTvFactory方法的調用獲取基類。 – Finbarr 2010-05-31 13:35:47

+0

@Finbarr,這是一種方法,但我更喜歡單獨的工廠加載器類。這使代碼可重用。 – 2010-05-31 13:41:50

+0

這是瘋狂的膨脹。所有這些工廠之間的差異將只是在調用'new'之後的一個枚舉值?哇,這裏真棒軟件工程。請重新閱讀您的[SOLID](http://www.blackwasp.co.uk/SOLIDPrinciples.aspx)原則。 – 2013-12-09 02:29:43

0

枚舉是邪惡的。與接口替換它們:

public interface IVendor { /*...*/ } 

然後你可以爲每個供應商提供IVender的具體實現。

public class Samsung : IVendor { /*...*/ } 

public class Philips : IVendor { /*...*/ } 

public class Sony : IVendor { /*...*/ } 

目前還不清楚我爲什麼要問抽象工廠,或什麼是你希望能夠做的正是...

+1

枚舉可以實現接口:-) – Finbarr 2010-05-31 13:34:02

+0

@Finbarr,在某些語言中,是的。但是,這裏沒有指定語言。從代碼摘錄來看,它不是C++,既不是Java,也不是C#? – 2010-05-31 13:44:07

+0

是的......這是C# – Amit 2010-06-01 04:47:05