One_KWS

추상 팩토리 패턴 (Abstract Factory Pattern) 본문

디자인 패턴

추상 팩토리 패턴 (Abstract Factory Pattern)

One-Kim 2022. 6. 8. 11:11

소개

추상 팩토리 패턴은 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴이다. 즉, 관련성이 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용하다.

추상 팩토리 패턴을 사용하면 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있다. 이때, 실제로 어떤 제품이 생성되는지는 전혀 알 필요도 없기 때문에 클라이언트와 팩토리에서 생산되는 제품을 분리시킬 수 있다.

 

AbstractFactory

AbstractFactory는 모든 Concrete Factory에서 구현해야 하는 인터페이스다. 제품을 생산하기 위한 일련의 메소드들을 정의한다.

public interface AbstractFactory {
	void CreateProduct(A);
	void CreateProduct(B);
}

ConcreteFactory

Concrete Factory에서는 서로 다른 제품군을 구현한다. 클라이언트에서 제품이 필요하면 이 팩토리 가운데 적당한 걸 골라서 쓰면 되기 때문에 제품 객체의 인스턴스를 직접 만들 필요가 없다.

public class ConcreteFactory1 : AbstractFactory {
    public AbstractProductA CreteProductA() {
        return new ProductA1();
    }

    public AbstractProductB CreteProductB() {
        return new ProductB1();
    }
}

public class ConcreteFactoty2 : AbstractFactory {
    public AbstractProductA CreteProductA() {
        return new ProductA2();
    }

    public AbstractProductB CreteProductB() {
        return new ProductB2();
    }
}

ConcreteProduct

각 Concrete Product에서 필요한 제품들을 구현한다.

public abstract class AbstractProductA {
    public abstract void Print();
}

public class ProductA1 : AbstractProductA {
    public override void Print() {
        Console.WriteLine("Create Product A1!");
    }
}

public class ProductA2 : AbstractProductA {
    public override void Print() {
        Console.WriteLine("Create Product A2!");
    }
}

public abstract class AbstractProductB {
    public abstract void Print();
}

public class ProductB1 : AbstractProductB {
    public override void Print() {
        Console.WriteLine("Create Product B1!");
    }
}

public class ProductB2 : AbstractProductB {
    public override void Print() {
        Console.WriteLine("Create Product B2!");
    }
}

Client

클라이언트를 만들 때는 추상 팩토리를 바탕으로 만든다. 실제 팩토리는 실행시에 결정된다.

class Client {
    private AbstractProductA abstractProductA;
    private AbstractProductB abstractProductB;

	public Client(AbstractFactory factory) {
        abstractProductA = factory.CreteProductA();
        abstractProductB = factory.CreteProductB();
    }
		
    public void Run() {
        abstractProductA.Print();
        abstractProductB.Print();
        Console.WriteLine($"This factory produce {abstractProductA.GetType().Name} and {abstractProductB.GetType().Name} \n");
    }
}

 

실행

Main 함수에서 추상 팩토리의 인스턴스를 생성하여 클라이언트에 전달하면 해당 팩토리에서 제품을 생산한다.

class Program {
    static void Main(string[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        Client client1 = new Client(factory1);
        client1.Run();

        AbstractFactory factory2 = new ConcreteFactoty2();
        Client client2 = new Client(factory2);
        client2.Run();
    }
}
 

'디자인 패턴' 카테고리의 다른 글

스트래티지 패턴(Strategy Pattern)  (0) 2023.04.13
커맨드 패턴(Command Pattern)  (0) 2023.04.10