2012-02-03 5 views
0

어떻게 이러한 조건을 건너 뛸 수 있습니까?공장 패턴 - 유형 특정 조건 피하기

저는 공장 패턴을 사용하고 있습니다.

pizza = pizzaFctory.create ('xxx'); # e.g. these types are a,b,c,d 

는 지금은 기능

pizza->verifySomething ('yyy'); 

에게 전화를 여기 제 질문은 : 인수 '푸'다른 유형에 따라 다릅니다은 (A, B, C, D). 예 : create()의 인수가 'a'이면 verifySomething의 인수 'fooa'입니다. 마찬가지로, create()에 대한 인수가 'b'이면 verifySomething 'foob'에 대한 인수.

하나의 조건을 넣고 검증 할 수 있음을 이해합니다.

if (pizza->isTypeA) 
    { 
    pizza->verifySomething ('fooa'); 
    } 

조건 인 경우 이것을 피하고 싶습니다. 그것을 성취 할 수있는 방법을 가르쳐주세요.

당신은 verifySomething의 인수를 넣을 수 있습니다

답변

2
public abstract Pizza 
{ 
    public abstract bool VerifySomething(object obj); 
} 

public class APizza : Pizza 
{ 
    public bool VerifySomething(object obj) 
    { 
     FooA foo = (FooA)obj; 
     ... 
    } 
} 

public class BPizza : Pizza 
{ 
    public bool VerifySomething(object obj) 
    { 
     FooB foo = (FooB)obj; 
     ... 
    } 
} 

(C#에서,하지만 이해할 수 있어야한다) 피자의 종류는 VerifySomething 방법을 사용할 수 없습니다. Liskov Substitution Principle (LSP)을 위반하는 것일 수 있습니다. 이 사실을 더욱 분명하게 할 수있는 클래스를 분리하는 더 좋은 방법이있을 수 있습니다.

0

는이 라인을 따라 재산 (또는 방법) 피자의 생성, 무언가로 모두의 경우

public abstract class Pizza 
{ 
    public abstract string GetParameter(); 

    public bool VerifySomething1() 
    { 
     //You can use GetParameter here directly 
    } 

    public bool VerifySomething2(string parameter) 
    { 
     //The parameter is passed from the caller 
    } 
} 

public class Capricciosa : Pizza 
{ 
    public override string GetParameter() {return "CapricciosaParameter";} 
} 

public class Vezuvio : Pizza 
{ 
    public override string GetParameter() {return "VezuvioParameter";} 
} 

Pizza pizza = PizzaFactory.Create("Vesuvio"); 

pizza.VerifySomething1(); //parameter is gotten inside the method 
pizza.VerifySomething2(pizza.GetParameter()); //the parameter is explicitly passed