3. 팩토리 메서드 패턴(Factory Method Pattern) 구현

팩토리 메서드 패턴 프로젝트 다운로드

3. 4 구현

팩토리 메서드 패턴 예제 프로그램은 EHApp, IView, MyView, MyApp, 테스트 코드 순으로 구현하겠습니다.

3.4.1 EHApp

EHApp에는 뷰 개체를 생성하는 메서드를 약속합니다. 그리고 초기화, Run, 해제순으로 수행하는 뼈대를 제공하며 초기화에서는 뷰 개체를 생성하는 메서드를 호출하여 뷰 개체를 설정할게요.

▶EHApp.cs

namespace FactoryMethod
{
    abstract class EHApp //뼈대를 제공하는 추상 클래스
    {
        protected IView MainView
        {
            get;
            set;
        }
        public virtual void InitInstance()
        { 
            MainView = MakeView();//뷰 개체를 설정
        }
        public virtual void Run()
        {
            MainView.Show();
        }
        public virtual void ExitInstance()
        {
            MainView = null;
        }
        protected abstract IView MakeView();//뷰 개체를 생성하는 메서드 약속
    }
}


3.4.2 IView, MyView

IView는 응용에서 사용자와 상호작용을 하는 뷰 개체를 보여주는 기능을 약속한 인터페이스입니다. IView를 기반으로 정의한 MyView 클래스에서는 약속한 보여주기 기능을 목적에 맞게 구현합니다.

▶IView.cs

namespace FactoryMethod
{
    interface IView
    {
        void Show();//보여주기 기능에 대한 메서드 약속
    }
}

▶MyView.cs

using System;
namespace FactoryMethod
{
    class MyView:IView
    {
        public MyView()
        {
            Console.WriteLine("MyView 개체 생성");
        }
        public void Show()
        {
            Console.WriteLine("메인 뷰 활성화");
        }
    }
}


3.4.3 MyApp

MyApp에서는 구체적으로 어떠한 뷰를 생성할 것인지를 구현해야 합니다. 그리고 필요하다면 EHApp에 정의한 메서드를 재정의하여 필요한 작업을 수행할 수 있습니다. 여기에서는 초기화 메서드와 해제 메서드를 재정의할게요.

▶MyApp.cs

using System;
namespace FactoryMethod
{
    class MyApp:EHApp
    {
        public override void InitInstance()//재정의
        {
            Console.WriteLine("MyApp 초기화");
            base.InitInstance();
        }
        public override void ExitInstance()//재정의
        {
            base.ExitInstance();
            Console.WriteLine("MyApp 해제");
        }
        protected override IView MakeView()//뷰 개체를 생성하는 메서드 구체적 구현
        {
            return new MyView();
        }
    }
}


3.4.4
테스트 코드

테스트는 단순히 MyApp 개체를 생성하여 초기화, Run, 해제를 수행하는 것으로 하겠습니다.

▶Program.cs

namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            MyApp app = new MyApp();
            app.InitInstance();
            app.Run();
            app.ExitInstance();
        }
    }
}

▶실행 결과

MyApp 초기화
MyView 개체 생성
메인 뷰 활성화
MyApp 해제

이상으로 세 번째 주제인 팩토리 메서드 패턴에 대하여 살펴보았습니다.