1. Singleton Pattern(싱글턴 패턴 C#)

|

[읽기전에]

UML 다이어그램이 이해가 가지 않으시면 다음의 포스팅을 보고오세요 

UML클래스 다이어그램 기본상식 http://hongjinhyeon.tistory.com/25

디자인 패턴을 시작하며 http://hongjinhyeon.tistory.com/24


자 첫번재 포스팅을 시작하겠습니다.

제일 간단하고 쉬운(?) 패턴을 먼저 시작하겠습니다.

1. Singleton Pattern 정의

   -해당 클래스의 인스턴스가 하나만 생성이 되는것을 보장하며 어디서든지 그 인스턴스에 접근이 가능하도록 만드는 패턴
    (Ensure a class has only one instance and provide a global point of access to it.)
 
2. UML Diagram
    


  :싱글톤 패턴에서는 클래스에 instance라는 멤버변수를 선언을하고(private), 생성자를 private로 선언하여 외부에 노출이 되지 안도록
   합니다. 이후에 Static으로 전역에서 접근이가능한 메서드를 생성해서 인스턴스를 반환합니다.
   이때 멤버변수에 이미 변수가 생성이 되어 있다면 해당 인스턴스를 리턴하며, 만약 인스턴스가 한번도 초기화 되지 않았다면, 생성해서
   리턴합니다.

3. 사용목적 및 용도

   -시스템에서 전역으로 관리되고 단하나의 클래스에서만 정보가 유지되는 것을 원할때
   -보통 시스템 자원관리나 정보를 관리합니다. 예를 들어서, 프린터가 하나있는데 그것에 대한 접근 인스턴스가 여러개가 생성이 되어서
    사용이 된다면 데드락이나 오류현상이 발생할 요지가 큽니다.(동기화를 해주면 되겠지만 거추장스럽고..) 이럴때 하나의 클래스에서만
    관리해주면 해결이 됩니다.
   -스타크래프트에서 사용이 된다고 생각한다면, 게임 전체적으로 필요한  시간,유닛 킬수, 건물 갯수(엘리를 위해서..) 등등 많이 있겠네요

4. 소스코드
using System;
 
namespace DoFactory.GangOfFour.Singleton.Structural
{
  
  class MainApp
  {
 
    static void Main()
    {
      
      Singleton s1 = Singleton.Instance();
      Singleton s2 = Singleton.Instance();
 
      if (s1 == s2)
      {
        Console.WriteLine("Objects are the same instance");
      }
 
      // Wait for user
      Console.ReadKey();
    }
  }
 
   //싱글톤 클래스
   class Singleton
  {
    private static Singleton _instance;
 
    //  'protected' 로 생성자를 만듦
    protected Singleton()
    {
    }
 
    // 'static'으로 메서드를 생성
    public static Singleton Instance()
    {
      
      //다중쓰레드에서는 정상적으로 동작안하는 코드입니다.
      //다중 쓰레드 경우에는 동기화가 필요합니다.
      if (_instance == null)
      {
        _instance = new Singleton();
      }

      //다중 쓰레드 환경일 경우 Lock 필요
      //if (_instance == null)
      //{
      //  lock(_instance)
// { // _instance = new Singleton(); // } //} return _instance; } } }

OUTPUT:


5. 적용 결론
- 전역변수를 사용해서 싱글톤을 사용 안할수도 있지만, 싱글톤은 전역변수를 사용하는데에서 발생하는 네임스페이스 충돌을 막을수가 있습니다.

-싱글톤 패턴은 '게으르게' 인스턴스가 생성이 되므로, 객체가 자원을 많이 잡아 먹을때 유용한 생성기법입니다. ( 필요할때 초기화해서 리턴하므로...)

 


*네 이것으로 싱글턴 패턴에대한 포스팅을 마치겠습니다.
 다음 시간에는 Factory Method 패턴에 대해서 다루겠습니다.


[참조]
   -Head First Design Patterns
   -http://www.dofactory.com
 

 





And