2010-06-01 1 views
0

우선 ... 나는 패턴 세계에 초보자입니다, 그래서 저를 해결하는 경우 잘못된 어디서나 시나리오 : 는주어진 시나리오에서 추상 팩토리 패턴이 올바르게 구현 되었습니까?

그래서 3 개 단체가 기업, 즉있다 DIFF 크기의 여러 제품을 제공하는 여러 회사, 그들의 제품과 크기가있다

제품

의 나는

추상 팩토리 패턴의 구현보다 정확 ... 나는 제품을 원하는 얻을 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()에 대한 정의를 제공하는 방법으로 확신이 없습니다. .... 그 pls에 대해 좀 더 생각해 주시겠습니까? – Amit

+0

@Amit, 내 업데이트를 참조하십시오. –

+0

많은 감사 :-) – Amit

관련 문제