2012-02-03 6 views
0

どうすればこれらの条件をスキップできますか?工場のパターン - タイプ固有の条件を避ける

私は工場のパターンを使用しています。 (A、B、C d)の引数 'fooは' さまざまな種類の異なる :

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

今、私はここで

pizza->verifySomething ('yyy'); 

関数を呼び出すには、私の質問です。例えばcreate()の引数が 'a'の場合は、verifySomethingの引数 'fooa'になります。同様に、create()の引数が 'b'の場合は、verifySomethingの引数 'foob'になります。

私は1つの条件を入れて検証できることを理解します。

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

私が条件ならば、これを回避したいです。それを実現する方法を教えてください。

答えて

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; 
     ... 
    } 
} 

をあなたは、作成したピザのプロパティ(またはメソッド)としてverifySomethingのために、これらの線に沿って何か引数を置くことができます(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 
関連する問題