디자인패턴] 싱글턴 패턴[SingleTurn Pattern](C#)

싱글턴 패턴 - 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공합니다.

 

핵심정리

★ 어떤 클래스에 싱글턴 패턴을 적용하면 애플리케이션에 그 클래스의 인스턴스가 최대 한 개 까지만 있도록 할 수 있습니다.

 

★ 싱글턴 패턴을 이용하면 유일한 인스턴스를 어디서든지 접근할 수 있도록 할 수 있습니다.

 

★ 싱글턴 패턴을 구현할 때는 private 생성자와 정적 메소드, 정적 변수를 사용합니다.

 

★ 다중 스레드를 사용하는 애플리케이션에서는 속도와 자원문제를 파악해보고 적절한 구현법을 사용해야 합니다.( 사실 모든 애플리케이션에서 멀티 스레딩을 쓸 수 있다고 생각해야 합니다.)

 

★ 클래스 로더가 여러개 있으면 싱글턴이 제대로 작동하지 않고 여러개의 인스턴스가 생길 수 있습니다.

 

주의!! 멀티 스레딩을 했을경우 여러개의 인스턴스가 생길 수 있습니다.

 

 

사용자 삽입 이미지

 
 
using System;
using System.Collections.Generic;
using System.Text;
namespace SingleTurn
{
    class SingleTurnBoiler
    {
        private Boolean empty;
        private Boolean boiled;
        public Boolean isEmpty()
        {
            return empty;
        }
        public Boolean isBoiled()
        {
            return boiled;
        }
        public void fill()
        {
            if (isEmpty())
            {
                this.empty = false;
                this.boiled = false;
                Console.WriteLine("보일러에 재료를 넣습니다.");
            }
            else
            {
                Console.WriteLine("보일러가 이미 가득 차있습니다.");
            }
        }
       
        public void boil()
        {
            if (!isEmpty() && !isBoiled())
            {
                this.boiled = true;
                Console.WriteLine("보일러를 데우고있습니다.");
            }
            else
            {
                Console.WriteLine("보일러가 이미 데우고 있습니다.");
            }           
        }
        public void drain()
        {
            if (!isEmpty() && isBoiled())
            {
                // 끓인 재료를 다음 단계로 넘김
                this.empty = true;
                Console.WriteLine("맛있는 초코바가 나왔습니다.");
            }
            else
            {
                Console.WriteLine("초코바가 나올 준비가 되어있지 않습니다.");
            }
        }
        private static SingleTurnBoiler uniqueInstance;
        private SingleTurnBoiler()
        {
            // 이 코드는 보일러가 비어있을대만 돌아갑니다.
            this.empty = true;
            this.boiled = false;
        }

        public static SingleTurnBoiler getInstance()
        {
            if (uniqueInstance == null)
            {
                uniqueInstance = new SingleTurnBoiler();
            }
            return uniqueInstance;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // SingleTurn st = new SingleTurn();     <-- 컴파일 에러
            SingleTurnBoiler stBoiler1 = SingleTurnBoiler.getInstance();  // 에러 안남
            SingleTurnBoiler stBoiler2 = SingleTurnBoiler.getInstance();      
           
            stBoiler1.fill();        // 보일러에 재료를 가득 채움
            stBoiler2.fill();        // 보일러에 재료를 가득채웠는데 한번 더 채울려고 시도함
            stBoiler1.boil();        // 보일러를 끓임
           
            stBoiler2.boil();        // 보일러를 끓임
            stBoiler1.drain();       // 보일러에서 상품을 얻음
            stBoiler2.drain();       // 보일러에서 상품을 얻음
            // 이렇게 하면 오로지 한개의 인스턴스만 생성 할 수 있습니다.
        }
    }
}

 

위 코드에 대한 실행화면입니다.

 

사용자 삽입 이미지


 
 
출처 : Head Firstd의 Design Patterns 책의 내용을 C#으로 만들어본 것입니다.
( 책에는 자바로만 나와있더군요 ㅠㅠ )

댓글

Designed by JB FACTORY