Singleton Pattern


1. 정의

- 오직 단 하나의 인스턴스만 생성되는 클래스로 전역 범위에서 접근 가능함


2. 설명

- 생성자를 private로 선언해서 하나의 인스턴스 외에는 생성 자체가 불가능 하도록 함.

- 해당 클래스의 인스턴스를 저장하는 Instance란 멤버변수를 선언하고 이 멤버변수에 접근하는 방식으로만 인스턴스 접근

- Instance에 접근 할 때 만약 인스턴스가 생성되어 있지 않을 경우에만 생성자를 호출해 인스턴스를 생성.

- Instance 멤버변수를 static으로 선언하기 때문에 전역 범위에서 접근 가능.


3. 장/단점

1) 장점

- 인스턴스가 하나만 생성 되므로 메모리 관리가 효율적이다

- 인스턴스가 여러개 생성되면 안되는 경우에 사용하는 것이 좋다

2) 단점

- 전역변수나 마찬가지라 다양한 접근이 있을 경우 데이터 관리에 문제가 생길 수 있다

- 멀티 쓰레드 프로그램 일 경우 locking에 신경 써주지 않으면 문제가 발생한다.


4. 예제 코드

using System.IO;
using System.Text;

namespace CsharpTest
{
    class SingletonLog
    {
        // 로그 파일 이름
        private readonly string fileName = "log.txt";
        // 파일 입출력 위한 StreamWriter 변수
        private StreamWriter sw;
        // 로그 포멧 정리 위한 StreamBuilder 변수
        private StringBuilder sb;

        // 로그 종류
        private readonly int[] code = { 1000, 2000, 3000 };
        // 로그 중요도
        private readonly string[] grade = { "WARNING", " ERROR ", " INFOR " };
        
        // 하나 뿐인 인스턴스
        private static SingletonLog _instance;

        // 표면상 보이는 인스턴스
        public static SingletonLog Instance
        {
            get
            {
                // 인스턴스가 생성되지 않았을 경우 생성
                if ( _instance == null )
                    _instance = new SingletonLog();

                return _instance;
            }
        }

        // 생성자
        private SingletonLog()
        {
            // 파일 열기
            sw = new StreamWriter( fileName, true );
            // StringBuilder 생성
            sb = new StringBuilder();
        }

        // 로그 출력하는 함수
        public void WriteLog(int codeIndex, int gradeIndex, string log)
        {
            // 로그 포멧 지정
            sb.AppendFormat( "[{0}]{1}({2}) : {3}", System.DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss"), code[codeIndex], grade[gradeIndex], log );

            // 로그 출력
            sw.WriteLine( sb.ToString() );
            sw.Flush();

            // StringBuilder 초기화
            sb.Clear();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // 특별한 생성자 없이 그냥 전역변수처럼 호출
            SingletonLog.Instance.WriteLog( 0, 0, "test0" );
            SingletonLog.Instance.WriteLog( 1, 1, "test1" );
            SingletonLog.Instance.WriteLog( 2, 2, "test2" );
        }
    }
}


5. 출력 결과물

<log.txt>

[2016-11-25 11:11:25]1000(WARNING) : test0

[2016-11-25 11:11:26]2000( ERROR ) : test1

[2016-11-25 11:11:26]3000( INFOR ) : test2



'C# > Design Pattern' 카테고리의 다른 글

[Design Pattern C#]Command Pattern  (0) 2016.11.28

원래 프로그래밍을 했던 사람이 1인 개발자로 시작하는데 가장 큰 걸림돌은 역시... 리소스다!!!

물론 게임 기획이나 밸런싱 등 처음 해보는 것들이라 쉽진 않지만

미적 감각이 없는 대부분의 공대생들은... 리소스가 문제다 ㅠㅠㅠㅠ


이런 고민을 떠안고 있던 중 고마운 은인이 등장해 좋은 리소스 제작툴을 가르쳐 주었다.


바로 매지카복셀(MagicaVoxel)

복셀(Voxel)이란 것은 3D 도트라 생각해주면 된다. 잘 상상이 안가시면 마인 크래프트 같은 디자인(?)이라 보시면 될거 같다.


- 매지카복셀 공식 사이트.

https://voxel.codeplex.com/



- 매지카 복셀 공부 동영상

https://www.youtube.com/watch?v=D4WIUNCbds8&list=PL-0nb9b-1MFhncBNUOzvp0wil7xm_QHqg

'마지막잎새'님의 매지카복셀 에디터 강좌


https://www.youtube.com/watch?v=zY0fW1Kvi2s&list=PL-0nb9b-1MFjDQNrBS43q3PO4Ob2TEB2U

'마지막잎새'님의 매지카복셀 애니메이션 강좌



- 블랜더(Blender) 공식사이트

https://www.blender.org/

OS에 비유하자면 리눅스 급의 3D 그래픽 프로그램.

복셀에 본을 넣을 수 있다.(마지막 잎새님 강좌 참조)


- Adobe Mixamo

https://www.mixamo.com/

블렌더로 삽입한 본을 이용해 애니메이션을 구현하고자 할 때

무료로 애니메이션을 구할 수 있고 상업적으로 사용 가능.(2016.09.10 확인)




위 툴들을 이용해 게임을 개발할 생각이다.

이 카테고리에는 개발하다가 올리고 싶을 때마다 갱신예정.


- 전체적인 PHP 정리된 사이트

http://modernpug.github.io/php-the-right-way/#books


- 위 사이트에서 찾은 무료 PHP7 책 (이 책 내용을 이 카테고리에 정리)

https://daylerees.com/php-pandas/


- PHP framework 사용량 비교 2016

http://webrevisions.com/tutorials/php-framework-the-best-php-framework-for-2013/


- PHP framework 장단점 비교

http://www.hongkiat.com/blog/best-php-frameworks/


- PHP, HHVM, Node.Js 성능 비교

http://www.hostingadvice.com/blog/comparing-node-js-vs-php-performance/


- javascript framework 2016

https://colorlib.com/wp/javascript-frameworks/


- html/css framework 2016

https://colorlib.com/wp/free-css3-frameworks/

+ Recent posts