2010-06-01 34 views
0

第一件事......我是新手模式的世界,所以糾正我,如果不對任何地方 場景: 有多家公司提供差異大小的多個產品抽象工廠模式是否針對特定場景正確實施....?

所以有3個實體,即公司,他們的產品和大小產品

的我對這個即實現抽象圖案,讓我 IProductFactory界面的創建,從而獲得所需的產品實例...

下面是實施抽象工廠模式的正確???如果沒有,那麼請糾正方法 + 還告訴我,如果任何其他的模式可以用於這種情況下提前 謝謝...

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

public enum Product 
{ 
    PlasmaTv = 0, 
    DVD = 1 
} 

public enum ProductSize 
{ 
    FortyTwoInch, 
    FiftyFiveInch 
} 

interface IProductFactory 
{ 
    IPhilips GetPhilipsProduct(); 
    ISony GetSonyProduct(); 
} 

interface ISony 
{ 
    string CreateProducts(Product product, ProductSize size); 
} 
interface IPhilips 
{ 
    string CreateProducts(Product product, ProductSize size); 
} 

class ProductFactory : IProductFactory 
{ 
    public IPhilips GetPhilipsProduct() 
    { 
     return new Philips(); 
    } 

    public ISony GetSonyProduct() 
    { 
     return new Sony(); 
    } 
} 

class Philips : IPhilips 
{ 
    #region IPhilips Members 

    public string CreateProducts(Product product, ProductSize size) 
    {// I have ingnore size for now.... 
     string output = string.Empty; 
     if (product == Product.PlasmaTv) 
     { 
      output = "Plasma TV Created !!!"; 
     } 
     else if (product == Product.DVD) 
     { 

      output = "DVD Created !!!"; 
     } 
     return output; 
    } 

    #endregion 
} 

class Sony : ISony 
{// I have ingnore size for now.... 
    #region ISony Members 
    public string CreateProducts(Product product, ProductSize size) 
    { 
     string output = string.Empty; 
     if (product == Product.PlasmaTv) 
     { 
      output = "Plasma TV Created !!!"; 
     } 
     else if (product == Product.DVD) 
     { 

      output = "DVD Created !!!"; 
     } 
     return output; 
    } 
    #endregion 
} 



IProductFactory prodFactory = new ProductFactory(); 
IPhilips philipsObj = prodFactory.GetPhilipsProduct(); 
MessageBox.Show(philipsObj.CreateProducts(Product.DVD, ProductSize.FortyTwoInch)); 

or 

//ISony sonyObj = prodFactory.GetSonyProduct(); 
//MessageBox.Show(sonyObj.CreateProducts(Product.DVD, ProductSize.FortyTwoInch)); 

回答

5

不,應該比較像這樣:

interface IProductFactory 
{ 
    string CreateProducts(Product product, ProductSize size); 
} 

class SonyProductFactory : IProductFactory 
{ 
    string CreateProducts(Product product, ProductSize size) { ... } 
} 
class PhilipsProductFactory : IProductFactory 
{ 
    string CreateProducts(Product product, ProductSize size) { ... } 
} 

... 
IProductFactory prodFactory = loadProductFactory(); 
MessageBox.Show(prodFactory.CreateProducts(Product.DVD, ProductSize.FortyTwoInch)); 

loadProductFactory()返回Sony或Philips工廠,可能基於配置或應用程序狀態。這個功能也可以被移植到一個單獨的工廠加載器類中,以使其更加可重用。

更新:一個簡單的實現可能是

IProductFactory loadProductFactory() { 
    String factoryName = System.getProperty("factory.name"); 
    if (factoryName.equals("Sony") { 
     return new SonyProductFactory(); 
    } else { 
     return new PhilipsProductFactory(); 
    } 
} 

一個更強大的版本,可以從配置文件加載具體產品工廠類名,加載類,驗證它是一個IProductFactory,然後返回它的實例。這樣做的好處是沒有更多的依賴關係到任何具體的產品工廠類,所以添加/更改/刪除工廠實現不需要重新編譯源代碼,只需要更改配置文件。

+0

老實說..我不確定如何爲loadProductFactory()提供定義。 ....你能否提供一些關於這些請求的更多想法? – Amit 2010-06-01 13:46:04

+0

@Amit,看我的更新。 – 2010-06-01 13:59:04

+0

非常感謝:-) – Amit 2010-06-01 14:18:43