[Design Pattern] 행동 패턴 3. 추상 팩토리 (Abstract Factory)
Table of Contents
추상 팩토리 (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
}
}