팩토리 메소드 패턴

10462 단어 csharpprogramming
팩토리 메소드 패턴은 객체를 생성하기 위한 인터페이스를 제공하지만 인스턴스화할 클래스는 서브클래스가 결정하도록 하는 생성 디자인 패턴입니다. 팩토리 메소드를 사용하면 클래스가 인스턴스화를 서브클래스로 연기할 수 있습니다.

문제
피자 가게를 만들고 고객에게 제공하는 여러 종류의 피자가 있다고 가정해 보겠습니다. 처음에 저희 가게가 굽고 있는 유일한 피자 종류는 4가지 치즈 피자입니다. 잠시 후 많은 고객이 더 다양한 피자를 요청했고 우리는 메뉴에 페페로니와 그리스 피자를 추가하기로 결정했습니다. 이것은 좋은 소식이지만 우리 코드는 어떻습니까?

해결책
여기에서 Factory Method Pattern이 유용합니다. 패턴은 직접 생성 호출을 팩토리 메소드 호출로 대체할 것을 제안합니다.

구현
가장 먼저 만들 것은 Pizza 추상 클래스입니다.

public abstract class Pizza
{
    public string Name { get; set; }
    public List<string> Ingredients { get; set; }
    public PizzaType Type{ get; set; }
}


그런 식으로 추상 클래스를 구현하는 구체적인 클래스를 만들 것입니다.

class FourCheesePizza : Pizza
{
    public FourCheesePizza()
    {
        Type = PizzaType.FourCheese;
        Name = "Cheese passion";
        Ingredients = new List<string> 
        {
            "Parmigiano Cheese",
            "Gorgonzola Cheese", 
            "Ricotta Cheese",
            "Taleggio Cheese",
            "Tomato" 
        };
    }
}



class GreekPizza : Pizza
{
    public GreekPizza()
    {
        Name = "The Greek freak";
        Type = PizzaType.Greek;
        Ingredients = new List<string> 
        { 
            "Spinach", 
            "Olives", 
            "Feta Cheese", 
            "Onion", 
            "Red Peppers" 
       };
    }
}



class PepperoniPizza : Pizza
{
    public PepperoniPizza()
    {
        Name = "Pepperoni lovers";
        Type = PizzaType.Pepperoni;
        Ingredients = new List<string> 
        {
            "Basil", 
            "Peperoni", 
            "Garlic", 
            "Tomato", 
            "Mozzarella Cheese" 
        };
    }
}


다음 단계는 실제 팩토리 인터페이스를 만들고 구현하는 것입니다.

interface IPizzaFactory
{
    Pizza CreatePizza(PizzaType type);
}

class PizzaFactory : IPizzaFactory
{
    public Pizza CreatePizza(PizzaType type)
    {
        switch (type)
        {
            case PizzaType.FourCheese:
                return new FourCheesePizza();
            case PizzaType.Pepperoni:
                return new PepperoniPizza();
            case PizzaType.Greek:
                return new GreekPizza();
            default:
                return null;
        }
    }
}


이제 팩토리를 사용하여 피자 유형 정보를 전달하여 피자 객체를 얻을 수 있습니다.

static void Main(string[] args)
{
    var pizza = OrderPizza(PizzaType.Greek);

    Console.WriteLine("Pizza name: " + pizza.Name);
    Console.WriteLine("---------------------");
    Console.WriteLine("Ingredients");
    Console.WriteLine("---------------------");
    Console.WriteLine(string.Join(Environment.NewLine, pizza.Ingredients));
    Console.ReadKey();
}

static Pizza OrderPizza(PizzaType type)
{
    IPizzaFactory factory = new PizzaFactory();
    return factory.CreatePizza(type);
}


더 많은 이야기를 읽고 싶다면 내 blog를 방문하십시오.

좋은 웹페이지 즐겨찾기