프로그램 설계 과정에서 생기는 공통적인 문제에 대한 해답을 패턴화 시킨 것
1만 개의 코드가 있는 하나의 파일에 문제가 생기면 에러를 찾기가 힘들다. 어떠한 부분의 코드를 수정해야 할 때 그로 인해 수정해야 하는 코드들도 수도 없이 늘어날 것이다. 이러한 문제점을 해결하기 위해 나온 것이 디자인패턴이다
디자인패턴을 참고하여 개발을 할 경우, 개발의 효율성과 유지보수성이 높아지며, 개발하는 팀원간의 빠른 커뮤니케이션이 가능하다
생성패턴
객체 생성 방법이 들어간 디자인 패턴
싱글톤 패턴, 팩토리 패턴, 추상팩토리 패턴, 프로토타입 패턴
구조패턴
더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
프록시, 어댑터, 브리지, 복합체, 데코레이터, 퍼사드, 플라이웨이트 패턴
행동패턴
클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
이터레이터 패턴, 옵저버 패턴, 전략 패턴, 커맨드 패턴 등..
오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공하는 패턴
인스턴스 유일성
한 번의 생성으로 인스턴스가 단일 객체로 고정된 메모리를 사용하기 때문에 메모리 소비에 효율적이다
전연적 접근
싱글톤 인스턴스는 프로그램 어디서든 접근이 가능하다
다른 클래스의 인스턴스 접근이 용이하여 원활한 데이터 공유 가능
Multi Thread 환경에서 동시성의 문제가 발생할 수 있다
(여러 스레드가 공유된 자원에 동시에 접근하고 수정하려 함)
의존성이 높아진다
여러 클래스와 Coupling이 되기 때문에 하나의 코드를 수정했을 때, 싱글톤과 연결된 다양한 곳에서 문제를 발생시킬 수 있다
유니티에서는 매니저류의 클래스를 만들거나 오디오, 이벤트 등 디바이스 IO를 다루는 곳에서 자주 사용된다.
Scene에 빈 객체를 생성한 후에 오직 하나의 객체만 생성되도록 만들고, DontDestroyOnLoad
메서드를 호출하여 Scene이 변경되어도 Destroy를 막아주는 형태로 구현한다
public class MyAudioPlay : MonoBehaviour
{
public AudioClip clip;
private void OnCollisionEnter(Collision collision)
{
//AudioManager에서 싱글톤 인스턴스를 얻어와
//해당 인스턴스의 Play()를 호출한다
AudioManager.Instance().Play(clip);
Destroy(this.gameObject);
}
}
public class AudioManager : MonoBehaviour
{
//객체가 생성된 이후로 계속해서 누적되는 값
int nMyPoint = 0;
//static 키워드로 자기 자신을 변수로 가진다
//static으로 선언된 순간 메모리에 이미 올라가짐
static AudioManager _instance = null;
public static AudioManager Instance()
{
return _instance;
}
void Start()
{
if( _instance == null )
_instance = this;
}
public void Play(AudioClip clip)
{
GetComponent<AudioSource>().PlayOneShot(clip);
}
public int GetPoint()
{
nMyPoint = nMyPoint + 1;
return nMyPoint;
}
}