단일체 패턴(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 사진 보기 모드 홍길동 사진 보기 모드 |
'.NET > 설계 패턴(C#)' 카테고리의 다른 글
[설계 패턴 C#] 7. 가교 패턴 (0) | 2016.06.09 |
---|---|
[설계 패턴 C#] 6. 적응자 패턴 (0) | 2016.06.09 |
[설계 패턴 C#] 원형 패턴(Prototype Pattern) (0) | 2016.04.17 |
[설계 패턴 C#] 팩토리 메서드 패턴(Factory Method Pattern) (0) | 2016.04.17 |
[설계 패턴 C#] 빌더 패턴(Builder Pattern) (0) | 2016.04.17 |