.NET/설계 패턴(C#)

[설계 패턴 C#] 원형 패턴(Prototype Pattern)

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

4. 원형 패턴(Prototype Pattern)


Prototype.zip

"본문 내용"은 언제나 휴일 본 사이트에 있습니다.




 

    ZoomLens.cs

using System;

namespace Prototype

{

    class ZoomLens:ICloneable //복제 가능한 클래스

    {

        readonly int min_zoomlevel;

        readonly int max_zoomlevel;

        int zoomlevel;

        readonly int min_focus;

        readonly int max_focus;

        int focus;

 

        public ZoomLens(int min_zlevel, int max_zlevel, int min_focus, int max_focus)

        {

            this.min_zoomlevel=min_zlevel;

            this.max_zoomlevel=max_zlevel;

            this.min_focus=min_focus;

            this.max_focus=max_focus;

            zoomlevel = min_zlevel;

            focus = min_focus;

        }

 

        public void Take()

        {

            Console.WriteLine("줌 레벨 가능 범위:{0}~{1}", min_zoomlevel,max_zoomlevel);

            Console.WriteLine("현재 줌레벨:{0}",zoomlevel);

            Console.WriteLine("포커스 조절 범위:{0}~{1}",min_focus,max_focus);

            Console.WriteLine("현재 포커스:{0}",focus);

        }

 

        public int ZoomIn()

        {

            if(zoomlevel<max_zoomlevel)

            {

                zoomlevel++;

            }

            return zoomlevel;

        }

 

        public int ZoomOut()

        {

            if(zoomlevel>min_zoomlevel)

            {

                zoomlevel--;

            }

            return zoomlevel;

        }

 

        public int NearFocus()

        {

            if(focus>min_focus)

            {

                 focus--;

            }

            return focus;

        }

        public int FarFocus()

        {

            if(focus<max_focus)

            {

                focus++;

            }

            return focus;

        }

 

        public object Clone()//자신을 복제한 개체를 반환하는 메서드

        {

            return new ZoomLens(min_zoomlevel, max_zoomlevel, min_focus, max_focus);

        }

    }

}


ProLine.cs

namespace Prototype

{

    enum TypeZoomLens{    NM_NM,  NM_NF,  NF_NF,  MF_NF,  MF_MF  }

    class ProLine

    {

        ZoomLens pt = null;

        public ProLine(TypeZoomLens typezoomlens)

        {

            switch (typezoomlens)

            {

            case TypeZoomLens.NM_NM:  pt = new ZoomLens(20, 70, 1, 100); break;

            case TypeZoomLens.NM_NF:   pt = new ZoomLens(20, 70, 1, 200); break;

            case TypeZoomLens.NF_NF:    pt = new ZoomLens(20, 300, 1, 200); break;

            case TypeZoomLens.MF_NF:    pt = new ZoomLens(70, 300, 1, 200); break;

            case TypeZoomLens.MF_MF:   pt = new ZoomLens(70, 300, 10, 200); break;

            default: pt = new ZoomLens(20, 70, 1, 100); break;

            }

        }

        public ZoomLens MakeLens() // 주문한 렌즈를 복제하여 생산하는 메서드

        {

            return pt.Clone() as ZoomLens;

        }

    }

}

 

LensFactory.cs

using System.Collections.Generic;

namespace Prototype

{

    class LensFactory

    {

        List<ProLine> lines = new List<ProLine>();

        public int GetMaxLines()

        {

            return lines.Count;

        }

        public LensFactory()

        {

            lines.Add(new ProLine( TypeZoomLens.NM_NM));

            lines.Add(new ProLine( TypeZoomLens.NM_NF));

            lines.Add(new ProLine( TypeZoomLens.NF_NF));

            lines.Add(new ProLine( TypeZoomLens.MF_NF));

            lines.Add(new ProLine(TypeZoomLens.MF_MF));

        }

        public ZoomLens Order(int index) //소비자가 주문한 렌즈를 생산

        {

            if ((index >= 0) && (index < lines.Count))

            {

                ProLine pline = lines[index];

                return pline.MakeLens();

            }

            return null;

        }

    }

}

 

Program.cs

using System;

namespace Prototype

{

    class Program

    {

        static void Main(string[] args)

        {

            LensFactory factory = new LensFactory();

            int lcnt = factory.GetMaxLines();

            ZoomLens lens = null;

 

            for(int i = 0; i<lcnt; i++)

            {

                lens = factory.Order(i);

                if(   lens != null )

                {

                    lens.Take();

                    Console.WriteLine(lens);

                }

            }

        }

    }

}

 

▶실행 결과

줌 레벨 가능 범위:20~70

현재 줌레벨:20

포커스 조절 범위:1~100

현재 포커스:1

 

줌 레벨 가능 범위:20~70

현재 줌레벨:20

포커스 조절 범위:1~100

현재 포커스:1

 

줌 레벨 가능 범위:20~70

현재 줌레벨:20

포커스 조절 범위:1~100

현재 포커스:1

 

줌 레벨 가능 범위:20~70

현재 줌레벨:20

포커스 조절 범위:1~100

현재 포커스:1

 

줌 레벨 가능 범위:20~70

현재 줌레벨:20

포커스 조절 범위:1~100

현재 포커스:1

 

 

반응형