.NET/설계 패턴(C#)

[설계 패턴 C#] 단일체 패턴(Singleton Pattern)

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

단일체 패턴(Singleton Pattern)

Singleton.zip

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


단일체 패턴(Singleton Pattern)



 

    MemoryCard.cs

using System.Collections.Generic;

 

namespace Singleton

{

    class MemoryCard

    {

        List<string> pictures = new List<string>();

 

        public int PictureCount //사진의 개수

        {

            get

            {

                return pictures.Count;

            }

        }

 

        public int Store(string picture)

        {

            pictures.Add(picture);

            return PictureCount;

        }

        public string this[int index]

        {

            get

            {

                if ((index < 0) || (index >= PictureCount))

                {

                    return string.Empty;

                }

                return pictures[index];

            }

        }

    }

}

 

InnerObject.cs

namespace Singleton

{

    class InnerObject //단일체 클래스

    {

        MemoryCard memorycard =null;

        public int Now

        {

            get;

            private set;

        }

        public static InnerObject Singleton //단일체에 접근하기 위한 속성

        {

            get;

            private set;

        }

        static InnerObject() //단일체를 생성하는 정적 메서드

        {

            Singleton = new InnerObject();

        }

        private InnerObject() //단일체로 구현하기 위해 private으로 접근 지정

        {

            Now = 0;

        }

        public int PictureCount

        {

            get

            {

                return memorycard.PictureCount;

            }

        }

        public void PutMemoryCard(MemoryCard memorycard)

        {

            this.memorycard = memorycard;

        }

        public void StorePicture(string subject)

        {

            Now = memorycard.Store(subject);

        }

        public string NowPicture //현재 위치의 사진

        {

            get

            {

                return memorycard[Now - 1];

            }

        }

        public void MoveBefore() //이전 사진으로 이동

        {

            if (Now > 1)

            {

                Now--;

            }

        }

        public void MoveNext() //다음 사진으로 이동

        {

            if (Now < PictureCount)

            {

                Now++;

            }

        }

    }

}


IView.cs

namespace Singleton

{

    interface IView

    {

        void View();

    }

}


InfoDisplay.cs

using System;

 

namespace Singleton

{

    class InfoDisplay:IView

    {

        public void View()// IView에 약속한 메서드 구체적 구현

        {

            InnerObject innerobj = InnerObject.Singleton;

            Console.WriteLine("정보 보기 모드");

            Console.WriteLine("전체 사진 수:{0}",innerobj.PictureCount);

            Console.WriteLine("현재 위치:{0}", innerobj.Now);

        }

    }

}

 

PictureDisplay

using System;

namespace Singleton

{

    class PictureDisplay:IView

    {

        public void View()

        {

            InnerObject innerobj = InnerObject.Singleton;

            Console.WriteLine("사진 보기 모드");

            Console.WriteLine(innerobj.NowPicture);

        }

    }

}

 

Camera.cs

namespace Singleton

{

    enum DisplayMode{    MODE_PICTURE,    MODE_INFO    }

 

    class Camera

    {

        InnerObject innerobj;

        DisplayMode displaymode;

        IView[] views = new IView[2];

 

        public static Camera Singleton //단일체에 접근하기 위한 속성

        {

            get;

            private set;

        }

        static Camera() //정적 생성자에서 단일체 생성

        {

            Singleton = new Camera();

        }

 

        private Camera() //단일체로 구현하기 위해 private으로 접근 지정

        {

            innerobj = InnerObject.Singleton;

            displaymode = DisplayMode.MODE_PICTURE;

            views[(int)DisplayMode.MODE_INFO] = new InfoDisplay();

            views[(int)DisplayMode.MODE_PICTURE] = new PictureDisplay();

        }

 

        public void PutMemoryCard(MemoryCard memorycard)

        {

            innerobj.PutMemoryCard(memorycard);       

        }

        public void TakeAPicture(string subject)

        {

            innerobj.StorePicture(subject);

        }

        public void View()

        {

            int vindex = (int)displaymode;

            views[vindex].View();

        }

        public void BeforePicture()

        {

            innerobj.MoveBefore();

        }

        public void NextPicture()

        {

            innerobj.MoveNext();

        }

        public void SetDisplayMode(DisplayMode displaymode)

        {

            this.displaymode = displaymode;

        }

    }

}

 

Program.cs

namespace Singleton

{

    class Program

    {

        static void Main(string[] args)

        {

            Camera camera = Camera.Singleton;

            MemoryCard mc = new MemoryCard();

 

            camera.PutMemoryCard(mc);

            camera.TakeAPicture("홍길동");

            camera.TakeAPicture("강감찬");

 

            ViewMode(camera);

            ViewPicture(camera);

 

            camera.BeforePicture();

            ViewMode(camera);

            ViewPicture(camera);

           

            camera.NextPicture();

            ViewPicture(camera);

        }

 

        private static void ViewMode(Camera camera)

        {

            camera.SetDisplayMode(DisplayMode.MODE_INFO);

            camera.View();

        }

        private static void ViewPicture(Camera camera)

        {

            camera.SetDisplayMode(DisplayMode.MODE_PICTURE);

            camera.View();

        }

    }

}

 

▶실행 결과

정보 보기 모드

전체 사진 수:2

현재 위치:2

사진 보기 모드

강감찬

정보 보기 모드

전체 사진 수:2

현재 위치:1

사진 보기 모드

홍길동

사진 보기 모드

 

반응형