싱글턴 패턴 - 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공합니다.
핵심정리
★ 어떤 클래스에 싱글턴 패턴을 적용하면 애플리케이션에 그 클래스의 인스턴스가 최대 한 개 까지만 있도록 할 수 있습니다.
★ 싱글턴 패턴을 이용하면 유일한 인스턴스를 어디서든지 접근할 수 있도록 할 수 있습니다.
★ 싱글턴 패턴을 구현할 때는 private 생성자와 정적 메소드, 정적 변수를 사용합니다.
★ 다중 스레드를 사용하는 애플리케이션에서는 속도와 자원문제를 파악해보고 적절한 구현법을 사용해야 합니다.( 사실 모든 애플리케이션에서 멀티 스레딩을 쓸 수 있다고 생각해야 합니다.)
★ 클래스 로더가 여러개 있으면 싱글턴이 제대로 작동하지 않고 여러개의 인스턴스가 생길 수 있습니다.
주의!! 멀티 스레딩을 했을경우 여러개의 인스턴스가 생길 수 있습니다.
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;
using System.Text;
namespace SingleTurn
{
class SingleTurnBoiler
{
private Boolean empty;
private Boolean boiled;
{
class SingleTurnBoiler
{
private Boolean empty;
private Boolean boiled;
public Boolean isEmpty()
{
return empty;
}
{
return empty;
}
public Boolean isBoiled()
{
return boiled;
}
{
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("보일러가 이미 데우고 있습니다.");
}
}
{
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("초코바가 나올 준비가 되어있지 않습니다.");
}
}
{
if (!isEmpty() && isBoiled())
{
// 끓인 재료를 다음 단계로 넘김
this.empty = true;
Console.WriteLine("맛있는 초코바가 나왔습니다.");
}
else
{
Console.WriteLine("초코바가 나올 준비가 되어있지 않습니다.");
}
}
private static SingleTurnBoiler uniqueInstance;
private SingleTurnBoiler()
{
// 이 코드는 보일러가 비어있을대만 돌아갑니다.
this.empty = true;
this.boiled = false;
}
{
// 이 코드는 보일러가 비어있을대만 돌아갑니다.
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(); <-- 컴파일 에러
{
static void Main(string[] args)
{
// SingleTurn st = new SingleTurn(); <-- 컴파일 에러
SingleTurnBoiler stBoiler1 = SingleTurnBoiler.getInstance(); // 에러 안남
SingleTurnBoiler stBoiler2 = SingleTurnBoiler.getInstance();
stBoiler1.fill(); // 보일러에 재료를 가득 채움
stBoiler1.fill(); // 보일러에 재료를 가득 채움
stBoiler2.fill(); // 보일러에 재료를 가득채웠는데 한번 더 채울려고 시도함
stBoiler1.boil(); // 보일러를 끓임
stBoiler2.boil(); // 보일러를 끓임
stBoiler2.boil(); // 보일러를 끓임
stBoiler1.drain(); // 보일러에서 상품을 얻음
stBoiler2.drain(); // 보일러에서 상품을 얻음
// 이렇게 하면 오로지 한개의 인스턴스만 생성 할 수 있습니다.
}
}
}
}
}
}
위 코드에 대한 실행화면입니다.
출처 : Head Firstd의 Design Patterns 책의 내용을 C#으로 만들어본 것입니다.
( 책에는 자바로만 나와있더군요 ㅠㅠ )
'Module > DesignPattern' 카테고리의 다른 글
[Design Pattern] 스트래티지(Strategy) 패턴 (0) | 2012.12.25 |
---|---|
Singleton Design Pattern Make DLL (0) | 2009.11.04 |
singleton template 싱글턴 템플릿 (0) | 2009.05.22 |
[디자인패턴] 팩토리 패턴[Factory Pattern](C#) (0) | 2008.07.22 |