추상 팩토리 패턴은 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴이다. 즉, 관련성이 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 유용하다.
추상 팩토리 패턴을 사용하면 클라이언트에서 추상 인터페이스를 통해서 일련의 제품들을 공급받을 수 있다. 이때, 실제로 어떤 제품이 생성되는지는 전혀 알 필요도 없기 때문에 클라이언트와 팩토리에서 생산되는 제품을 분리시킬 수 있다.
public interface AbstractFactory {
void CreateProduct(A);
void CreateProduct(B);
}
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();
}
}
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();
}
}