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 |
|---|