posted by 방랑군 2012. 1. 19. 01:14

Singleton 패턴은 굳이 용어를 들먹이지 않아도 자연스레 사용되는 패턴 중 하나입니다.

하나의 클래스에 대하여 하나의 인스턴스만 생성되게끔 만들어주는 것인데요.

 

단순히 로그를 남기는 File 로거를 구현해보고자 합니다.

클래스 다이어그램을 보시면 이해가 빠릅니다.

 



클래스 내부에 static 인스턴스를 반환하는 메서드를 포함하고, 생성자를 private로 제한함으로써

해당 클래스의 인스턴스를 생성하는 방법을 제한할 수 있습니다.

즉, 해당 클래스의 인스턴스를 획득할 수 있는 방법은 static 인스턴스를 반환하는 메서드를 호출하는 방법 뿐이겠지요.

 

public class LogManager
{
    
private static LogManager _instance;

 

    public static LogManager Instance
    {
        
get 
        {
            
if (_instance == null)
                _instance = 
new LogManager();

            return _instance; 
        }
    }

 

    private LogManager()  // Constructor as Private
    {
        _fileStream = 
File.OpenWrite(GetExecutionFolder() + "\\Application.log");
        _streamWriter = 
new StreamWriter(_fileStream);
    }

 

    private FileStream _fileStream;
    
private StreamWriter _streamWriter;

 

    public void WriteLog(string message)
    {
        
StringBuilder formattedMessage = new StringBuilder();
        formattedMessage.AppendLine(
"Date: " + DateTime.Now.ToString());
        formattedMessage.AppendLine(
"Message: " + message);

        _streamWriter.WriteLine(formattedMessage.ToString());
        _streamWriter.Flush();
    }

 

    public string GetExecutionFolder()
    {
        
return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
    }
}

로거를 Singleton 형태로 구현하였을 때 얻는 이점은 쉽게 떠올릴 수 있습니다.

1. 하나의 인스턴스를 돌려가며 사용하기 때문에 메모리가 절약됩니다.

2. File 접근에 대한 Locking과 그에 따르는 오버헤드를 고려하지 않아도 됩니다.

 

단점도 존재합니다.

1. 멀티-스레딩 환경에서는 약간의 오버헤드를 감수하여야 합니다. (.Net에서는 Thread Safe를 보장합니다 :D)

 

'강좌 > C#' 카테고리의 다른 글

C# 멀티코어 프로그래밍  (0) 2012.01.19
[C#] Template Method 패턴  (0) 2012.01.19
[C#] 리플렉션 Reflection  (1) 2012.01.19
[C#] 소멸자 (de-constructor, finalizer)  (0) 2012.01.18
Thread vs ThreadPool  (0) 2012.01.18