P3: 디자인 패턴 프로그래밍

추상 공장


Book Definition : 추상 팩토리 패턴은 구체적인 클래스를 지정하지 않고 관련 객체 또는 종속 객체의 패밀리를 만들기 위한 인터페이스를 제공합니다.
My Definition : 추상 팩토리 패턴을 사용하면 클라이언트(이 경우 NYStylePizzaFactory)가 추상 인터페이스를 사용하여 실제로 생산되는 실제 제품을 알지 못한 채 상대적(유사한) 제품 세트(예: NYStyleCheesePizza)를 생성할 수 있습니다.

문제



나는 지금까지 성공적인 피자 가게를 가지고 있지만 NYStylePizzaFactory에서 생산한 피자의 품질에 대한 불만을 받았습니다. 이 문제를 조사한 결과 현지 시장에서 구입한 피자를 준비할 때 품질이 낮은 재료를 사용하고 있음을 알게 되었습니다. 이 문제는 프랜차이즈에서 피자를 만드는 데 사용하는 재료의 품질을 모니터링하고 유지하기 위한 솔루션을 찾아야 하는 상황으로 이어집니다. 그래서 디자인 패턴 성경Head First Design Pattern을 읽었습니다.

그래서 Abstract Factory Pattern로 내 솔루션을 찾았습니다. 이것은 Ingredients FactoryNYStylePizzaFactory에 대한 성분을 제공할 ChicagoStylePizzaFactory를 만드는 데 도움이 되었습니다. 이 기사의 뒷부분에서 구현했습니다.

해결책



그리기에는 상당히 복잡한 클래스 다이어그램입니다. PizzaStore 측면에서 모든 것을 살펴 보겠습니다.


내가 뭘 한거지?


코드 구현



추상 팩토리를 구현하기 위해 코드를 많이 변경하지 않았습니다. 몇 가지 단계를 따라 새로운 변경 사항을 구현해 보겠습니다.

1단계: 재료 공장을 만들어 피자 재료를 만듭니다.

// filePath : Factory\IIngredientsFactory.cs
public interface IIngredientsFactory
{
    Dough CreateDough();
    Sauce CreateSauce();
    Cheese CreateCheese();
    Veggies[] CreateVeggies();
    Pepperoni CreatePepperoni();
    Clams CreateClam();
}


2단계: 재료 공급을 위해 IIngredientsFactory를 구현하고 NYPizzaIngredientFactoryChicagoPizzaIngredientsFactory를 만듭니다.

// filePath : Factory\NYPizzaIngredientFactory.cs
public class NYPizzaIngredientFactory : IIngredientsFactory
{
    public Cheese CreateCheese()
    {
        return new MozzarellaCheese();
    }
    public Clams CreateClam()
    {
        return new FreshClams();
    }
    public Dough CreateDough()
    {
        return new ThinCrustDough();
    }
    public Pepperoni CreatePepperoni()
    {
        return new Pepperoni();
    }
    public Sauce CreateSauce()
    {
        return new MarinaraSauce();
    }
    public Veggies[] CreateVeggies()
    {
        return new Veggies[] { new GarlicVeggie(), newOnionVeggie() };
    }
}


3단계: 이제 구성 요소를 구현하여 고유ChicagoPizzaIngredientsFactory를 생성할 수 있습니다.

4단계: 성분의 경우 다양한 유형의 성분을 구현하기 위해 클래스 상속을 사용했습니다. 내가 이것을 어떻게 구현했는지 보자.

// filePath: Factory\Ingredients\Cheese.cs
public class Cheese
{
}

// filePath: Factory\Ingredients\Categories\ReggianoCheese.cs
public class ReggianoCheese : Cheese
{
}

// filePath: Factory\Ingredients\Categories\MozzarellaCheese.cs
public class MozzarellaCheese : Cheese
{
}


5단계: 이 범주의 동일한 순서를 따르고 Clams , Dough , Pepperoni , SauceVeggies 에 대한 고유한 클래스를 만듭니다.

6단계: 재료 공장을 사용하고 피자를 만들기 위해 피자 카테고리를 변경해야 합니다.

// filePath: PizzaItems\Pizza.cs
public abstract class Pizza
{
    public string name { get; set; }
    public Dough dough { get; set; }
    public Sauce sauce { get; set; }
    public Veggies[] Veggies { get; set; }
    public Cheese cheese { get; set; }
    public Clams clams { get; set; }
    public abstract void prepare();
    public virtual void bake()
    {
        Console.WriteLine("Bake for 25 minute at 350.");
    }
    public virtual void cut(string cutStyle)
    {
        Console.WriteLine("Cutting the pizza into " +cutStyle + " slices.");
    }
    public virtual void box()
    {
        Console.WriteLine("Place pizza in official PizzaStore box.");
    }
    public void setName(string name)
    {
        this.name = name;
    }
    public string getName()
    {
        return name;
    }
}

// filePath: PizzaItems\Types\CheesePizza.cs
public class CheesePizza : Pizza
{
    private readonly IIngredientsFactory _ingredientFactory;

    public CheesePizza(IIngredientsFactory ingredientFactory)
    {
        _ingredientFactory = ingredientFactory;
    }
    public override void prepare()
    {
        Console.WriteLine("Preparing " + name);
        dough = _ingredientFactory.CreateDough();
        sauce = _ingredientFactory.CreateSauce();
        cheese = _ingredientFactory.CreateCheese();
        clams = _ingredientFactory.CreateClam();
    }
}


7단계: 편히 앉아 조금 쉬세요. 이제 재료 공장 구현이 완료되었으므로 지역 공장으로 전달하겠습니다. 시카고 피자 공장에서 구현할 수 있는 NY 피자 공장에서 구현하고 있습니다.

public class NYStylePizzaStore : PizzaStore
{
    public override Pizza CreatePizza(string type)
    {
        Pizza pizza = null;
        IIngredientsFactory ingredientsFactory = newNYPizzaIngredientFactory();
        switch (type)
        {
            case "Cheese":
                pizza = new CheesePizza(ingredientsFactory);
                pizza.setName("NY StyleCheese Pizza");
                break;
            case "Clam":
                pizza = new ClamPizza(ingredientsFactory);
                pizza.setName("NY StyleClam Pizza");
                break;
            default:
                Console.WriteLine("Please select valid pizza type.");
                break;
        }
        return pizza;
    }
}


당신의 견해를 공유하십시오



디자인 패턴에 대해 더 많은 글을 쓰고 싶다면 자유롭게 의견을 말해주세요. 고맙게 생각합니다.
또한 배우고 싶은 패턴을 언급하십시오.

좋은 웹페이지 즐겨찾기