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 해제
이상으로 세 번째 주제인 팩토리 메서드 패턴에 대하여 살펴보았습니다.