.NET/설계 패턴(C#)

[설계 패턴 C#] 추상 팩토리 패턴 (Abstract Factory Pattern)

언제나휴일 2016. 4. 17. 13:43
반응형

[설계 패턴 C#] 추상 팩토리 패 (Abstract Factory Pattern)










AbstractFactory.zip



"본문 내용"

[Escort GoF의 디자인 패턴] 1. 추상 팩토리 패턴 (Abstract Factory Pattern)

[Escort GoF의 디자인 패턴] 1. 추상 팩토리 패턴 (Abstract Factory Pattern) 설계

[Escort GoF의 디자인 패턴] 1.  추상 팩토리 패턴 (Abstract Factory Pattern) 구현


추상 팩토리 패턴 (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();

        }

    }

}

 

▶실행 결과

테스트

카메라에 렌즈가 장착이 되지 않았음

사진이 찍히지 않았습니다.

테스트

자동 초점 조절하다.

부드럽다.

테스트

사용자의 명령대로 초점을 잡다.

자연스럽다.


 

반응형