개발자들이 '이렇게 하면 더 좋다'라고 방법을 정립해 놓은 것.
생성은 팩토리 한 곳에서 하고, 다른 곳에서는 호출만 하는 방식
class Factory
{
public static Monster CreateMonster(string type)
{
switch (type)
{
case "Slime":
return new Slime();
case "Orc":
return new Orc();
}
return null;
}
}
위 처럼 몬스터를 만들 때 함수 하나로 처리 할 수 있도록 만듦.
하지만 개방폐쇄원칙을 위반하였고.
종류 추가할 때 계속 코드를 수정해주어야함.
심플 팩토리 패턴의 보완형이다.
개방폐쇄원칙을 위반하지 않았고 확장성이 높다.
하지만 객체 종류만큼 클래스의 개수가 늘어난다.
abstract class MonsterFactory
{
abstract public Monster CreateMonster();
}
class SlimeFactory : MonsterFactory
{
public override Monster CreateMonster()
{
return new Slime();
}
}
이 클래스는 게임(프로그램) 전체에 하나만 존재해야하는 클래스다.
게임 어디서든 접근이 가능하며, 데이터베이스와 같이 하나만 있는 것이 사용된다.
class GameManager
{
private static GameManager instance;
public static GameManager Instance
{
get
{
if (instance == null)
{
instance = new GameManager();
}
return instance;
}
}
private GameManager()
{
}
public void Gamestart()
{
Console.WriteLine("게임시작");
}
}
그럼 static과의 차이는 뭐가 있을까?
static 클래스는 객체를 만들 수 없다.
그렇기에 사용에 주의해야한다.
class Player
{
public void TakeDamage()
{
// hp 감소
// 피격 소리
// 캐릭터 깜빡임
// 피격 애니메이션
// hp게이지 감소
// 상태이상
// hp 클래스
// soundmanager
// rendering
// 캐릭터
// hpUI
// 상태이상 관련 클래스
}
}
위와같이 사용할 경우에
하나의 함수가 엄청 길어지게 되는데
옵저버 패턴을 사용하게 되면 각각의 다른 클래스에 함수를 +- 구독 해제 해주면서 코드 자체의 길이는 짧아진다.
하지만 수정이 필요한 경우가 생기거나 다른클래스에서 구독하는 방식이라 순서가 다르게 설정될 가능성이 있다.