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

One·2022년 6월 6일
1

Design Pattern

목록 보기
1/2
post-thumbnail

추상 팩토리 패턴

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

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

Class Diagram

Code

  • AbstractFactory는 모든 Concrete Factory에서 구현해야 하는 인터페이스다. 제품을 생산하기 위한 일련의 메소드들을 정의다.
    public interface AbstractFactory {
    	void CreateProduct(A);
    	void CreateProduct(B);
    }
  • 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();
        }
    }
  • 각 Concrete Factory에서 필요한 제품들을 구현한다.
    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!");
        }
    }
  • 클라이언트를 만들 때는 추상 팩토리를 바탕으로 만든다. 실제 팩토리는 실행시에 결정된다.
    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");
        }
    }
  • 이제 메인 함수에서 실행해 보면 된다. 추상 팩토리의 인스턴스를 생성하여 클라이언트에 전달하면 해당 팩토리에서 제품을 생산한다.
    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();
        }
    }
  • 실행 결과
profile
Unity Developer

0개의 댓글