[설계 패턴 C#] 추상 팩토리 패턴 (Abstract Factory Pattern)
"본문 내용"
[Escort GoF의 디자인 패턴] 1. 추상 팩토리 패턴 (Abstract Factory Pattern)
[Escort GoF의 디자인 패턴] 1. 추상 팩토리 패턴 (Abstract Factory Pattern) 설계
[Escort GoF의 디자인 패턴] 1. 추상 팩토리 패턴 (Abstract Factory Pattern) 구현
▶ITake.cs
namespace AbstractFactory { interface ITake //렌즈의 기능에 대한 추상적 약속 { void Take();//상을 맺히는 기능에 대한 약속 } } |
▶EvLens.cs
using System; namespace AbstractFactory { class EvLens:ITake { public void Take() //ITake에 약속된 기능을 구체적으로 구현 { Console.WriteLine("부드럽다."); } public void AutoFocus() { Console.WriteLine("자동 초점 조절하다."); } } } |
▶HoLens.cs
using System; namespace AbstractFactory { class HoLens:ITake { public void Take() //ITake에 약속된 기능을 구체적으로 구현 { Console.WriteLine("자연스럽다."); } public void ManualFocus() { Console.WriteLine("사용자의 명령대로 초점을 잡다."); } } } |
▶Camera.cs
namespace AbstractFactory { abstract class Camera { protected ITake Lens { get; set; } public virtual bool TakeAPicture() //사진을 찍는 가상 메서드 { if (Lens == null) { return false; } Lens.Take(); //렌즈에 상을 맺힌다. return true; } //호환성 있는 렌즈를 장착하는 메서드 - 구체적 구현은 파생 클래스에서 public abstract bool PutInLens(ITake itake); public ITake GetOutLens() { ITake re = Lens; Lens = null; return re; } public Camera() { Lens = null; } } } |
▶EvCamera.cs
namespace AbstractFactory { class EvCamera:Camera { //호환성 있는 렌즈를 장착하는 기능에 대한 구체적 구현 public override bool PutInLens(ITake itake) { EvLens evlens = itake as EvLens; //호환성 있는 Ev 렌즈 형식으로 참조 연산 if (evlens == null) //호환성 없는 렌즈일 때 { return false; } Lens = itake; //호환성 있는 렌즈일 때 장착 return true; }
public override bool TakeAPicture() { EvLens evlens = Lens as EvLens; if (evlens == null) { return false; } evlens.AutoFocus(); return base.TakeAPicture(); } } } |
▶HoCamera.cs
namespace AbstractFactory { class HoCamera:Camera { // 호환성 있는 렌즈를 장착하는 기능에 대한 구체적 구현 public override bool PutInLens(ITake itake) { HoLens holens = itake as HoLens; //호환성 있는 Ho 렌즈 형식으로 참조 연산
if (holens == null) // 호환성 없을 때 { return false; } Lens = itake; //호환성 있는 렌즈일 때 장착 return true; } public override bool TakeAPicture() { HoLens holens = Lens as HoLens; if (holens == null) { return false; } holens.ManualFocus(); return base.TakeAPicture(); } } } |
▶IMakeCamera.cs
namespace AbstractFactory { interface IMakeCamera // 호환성 있는 렌즈와 카메라를 생성하는 기능에 대한 약속 { ITake MakeLens(); Camera MakeCamera(); } } |
▶EvDayFactory.cs
namespace AbstractFactory { class EvDayFactory:IMakeCamera //Ev 렌즈와 Ev 카메라 생성하는 클래스 { public ITake MakeLens() //호환성 있는 EvLens를 생성하는 기능 구현 { return new EvLens(); } public Camera MakeCamera() //호환성 있는 EvCamera를 생성하는 기능 구현 { return new EvCamera(); } } } |
▶HoDayFactory.cs
namespace AbstractFactory { class HoDayFactory:IMakeCamera //Ho 렌즈와 Ho 카메라 생성하는 클래스 { public ITake MakeLens() //호환성 있는 EvLens를 생성하는 기능 구현 { return new HoLens(); } public Camera MakeCamera() //호환성 있는 EvCamera를 생성하는 기능 구현 { return new HoCamera(); } } } |
▶HoDayFactory.cs
using System; namespace AbstractFactory { class Tester { IMakeCamera[] factories = new IMakeCamera[2]; public Tester() { factories[0] = new EvDayFactory(); factories[1] = new HoDayFactory(); } //카메라와 렌즈의 호환성 테스트 private void TestCase(Camera camera, ITake lens) { Console.WriteLine("테스트"); if (camera.PutInLens(lens) == false) { Console.WriteLine("카메라에 렌즈가 장착이 되지 않았음"); } if (camera.TakeAPicture() == false) { Console.WriteLine("사진이 찍히지 않았습니다."); } }
public void Test() { TestDirect();//직접 카메라와 렌즈를 생성하여 호환성 테스트 TestUsingFactory();//팩토리를 통해 생성하여 호환성 테스트 } private void TestUsingFactory() { Camera camera = null; ITake lens = null; foreach (IMakeCamera factory in factories) { camera = factory.MakeCamera(); lens = factory.MakeLens(); TestCase(camera, lens); //호환성 테스트 } } private void TestDirect() { Camera camera = new EvCamera(); ITake lens = new HoLens(); TestCase(camera,lens); // 호환성 테스트 } } } |
▶HoDayFactory.cs
namespace AbstractFactory { class Program { static void Main(string[] args) { Tester tester = new Tester(); tester.Test(); } } } |
▶실행 결과
테스트 카메라에 렌즈가 장착이 되지 않았음 사진이 찍히지 않았습니다. 테스트 자동 초점 조절하다. 부드럽다. 테스트 사용자의 명령대로 초점을 잡다. 자연스럽다. |
'.NET > 설계 패턴(C#)' 카테고리의 다른 글
[설계 패턴 C#] 6. 적응자 패턴 (0) | 2016.06.09 |
---|---|
[설계 패턴 C#] 단일체 패턴(Singleton Pattern) (0) | 2016.04.17 |
[설계 패턴 C#] 원형 패턴(Prototype Pattern) (0) | 2016.04.17 |
[설계 패턴 C#] 팩토리 메서드 패턴(Factory Method Pattern) (0) | 2016.04.17 |
[설계 패턴 C#] 빌더 패턴(Builder Pattern) (0) | 2016.04.17 |