본문 바로가기
디자인패턴

[디자인패턴] 추상 팩토리 패턴 (Abstract Factory Pattern)

728x90
반응형

작동원리

비슷한 특징을 가진 여러개의 객체들을 체계적으로 생성하고 싶을 때 사용되는 패턴입니다. 비슷한 기능을 가진 객체들을 Interface로 묶고, 각각의 객체들을 생성하는 Factory를 Interface화 한 후에 상속받아 특성에 맞게 구현해줄 수 있습니다.

위의 예제에서는 OS에 따라 UI객체를 생성하는 Factory를 만들고, 각각의 Factory에서 특성에 맞는 객체들을 생성합니다.

 

public interface IButton { }
public class AndroidButton : IButton {}
public class IOSButton : IButton {}

public interface Scrollbar { }
public class AndroidScrollbar : Scrollbar { }
public class IOSScrollbar : Scrollbar { }


public interface OS_Factory
{
    public IButton CreateButton();
    public Scrollbar CreateScrollbar();
}

public class AndroidFactory : OS_Factory
{
    public IButton CreateButton()
    {
        return new AndroidButton();
    }
    public Scrollbar CreateScrollbar()
    {
        return new AndroidScrollbar();
    }
}
public class IOSFactory : OS_Factory
{
    public IButton CreateButton()
    {
        return new IOSButton();
    }
    public Scrollbar CreateScrollbar()
    {
        return new IOSScrollbar();
    }
}

public class FactoryOfOSFactory
{
    public OS_Factory CreateOS(string type)
    {
        OS_Factory os_factory = null;
        switch (type)
        {
            case "Android":
                os_factory = new AndroidFactory();
                break;
            case "IOS":
                os_factory = new IOSFactory();
                break;
        }
        os_factory.CreateButton();
        os_factory.CreateScrollbar();

        return os_factory;
    }
}

public class Program
{
    public void main()
    {
        FactoryOfOSFactory factoryOfOSFactory = new FactoryOfOSFactory();
        OS_Factory androidFactory = factoryOfOSFactory.CreateOS("Android");
        OS_Factory iosFactory = factoryOfOSFactory.CreateOS("IOS");

        androidFactory.CreateButton();
        androidFactory.CreateScrollbar();

        iosFactory.CreateButton();
        iosFactory.CreateScrollbar();
    }
}

 

 

장점

1. 팩토리를 생성할때 특성에 맞는 팩토리 하나를 선택하여 주면 그 이후로는 해당 팩토리에서 관련 특성을 가진 객체만 생성하여줍니다. 

2. 저 객체들을 생성하는 Client와의 디커플링을 어느정도 보장하여 줍니다.

 

단점

1. 팩토리에서 생성되는 객체들의 Interface가 종류별로 추가되기 때문에 많은량의 Interface가 생성되고, 코드 또한 더 복잡해질 수 있습니다.

반응형