Skip to main content

[Design Pattern] 행동 패턴 3. 추상 팩토리 (Abstract Factory)




추상 팩토리 (Abstract Factory) #

추상 팩토리

  • 구체적인 클래스를 몰라도 일련의 객체군을 만들 수 있는 인터페이스를 제공한다.



개념적인 예시 #

// 추상 팩토리 
public interface IAbstractFactory
{
    IProductA CreateProductA(); // 어떤 클래스의 인스턴스를 만들지는
    IProductB CreateProductB();
}

// 구체화된 팩토리1
class ConcreteFactory1 : IAbstractFactory
{
    // 이 팩토리에 맞는 객체군들을 만들 수 있다.
    
    public IProductA CreateProductA()
    {
        // 서브 클래스에서 결정한다. (팩토리 메서드)
        return new ConcreteProductA1(); 
    }

    public IProductB CreateProductB()
    {
        return new ConcreteProductB1();
    }
}

// 구체화된 팩토리2
class ConcreteFactory2 : IAbstractFactory
{
    public IProductA CreateProductA()
    {
        return new ConcreteProductA2();
    }

    public IProductB CreateProductB()
    {
        return new ConcreteProductB2();
    }
}

// 제품 A
public interface IProductA
{
    string UsefulFunctionA();
}

class ConcreteProductA1 : IProductA
{
    public string UsefulFunctionA()
    {
        return "A1";
    }
}

class ConcreteProductA2 : IProductA
{
    public string UsefulFunctionA()
    {
        return "A2";
    }
}

// 제품 B
public interface IProductB
{
    string UsefulFunctionB();

    string AnotherUsefulFunctionB(IProductA collaborator);
}

class ConcreteProductB1 : IProductB
{
    public string UsefulFunctionB()
    {
        return "B1";
    }

    public string AnotherUsefulFunctionB(IProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();

        return $"B1 collaborating with the ({result})";
    }
}

class ConcreteProductB2 : IProductB
{
    public string UsefulFunctionB()
    {
        return "B2";
    }

    public string AnotherUsefulFunctionB(IAbstractProductA collaborator)
    {
        var result = collaborator.UsefulFunctionA();

        return $"B2 collaborating with the ({result})";
    }
}

// 클라이언트
class Program
{
    static void Main(string[] args)
    {
        // factory에 따라
        IAbstractFactory factory = new ConcreteFactory1(); 
        
        // 알아서 알맞은 객체군을 만든다. 
        var productA = factory.CreateProductA(); 
        var productB = factory.CreateProductB();
        
        Console.WriteLine(productB.UsefulFunctionB());  // B1
        Console.WriteLine(productB.AnotherUsefulFunctionB(productA)); // B1 with A1
    }
}



References #