2024. 9. 28. 18:06ㆍ카테고리 없음
개요
팩토리 메서드 패턴에 대해 알아보겠습니다.
내용 - 팩토리 메서드 패턴을 사용하는 이유
원래 객체를 만들떄에는 필요한 클래스에서 new 키워드를 사용해서 객체를 생성하는데 이렇게 게 하면 구체적인 클래스에 의존하게 됩니다.
하지만 팩토리 메서드 패턴을 사용하면 객체 생성 로직을 한 곳에서 관리하니, 이런 문제를 해결할 수 있어요. 즉, 객체를 생성하는 책임을 팩토리 메서드에 위임하므로, 클래스마다 직접 객체를 생성할 필요가 없고, 한 곳에서 편리하게 객체를 관리하고 확장할 수 있습니다.
팩토리 메서드를 사용할때에는 또 다른 클래스를 생성한다고 생각하고 만드는 거다.
내가 팩토리 메서드 패턴을 사용하는 이유
내가 팩토리 메서드 패턴을 선택한 이유는 Creature 클래스 상속을 통해서 몬스터나 플레이어나 객체를 한번에 생성하기 위함.
팩토리 메서드 패턴의 주요 목적(이게 핵심)
같은 부모 클래스나 인터페이스를 상속받는 여러 하위 클래스들 간의 객체 생성 로직을 캡슐화하는 데 있습니다.
팩토리 메서드 패턴의 장점
1. 코드의 간소화: 객체 생성 로직을 한 군데에 모아두기 때문에 코드가 간결해지고, 유지보수하기 쉬워져요.
2. 유연성: 새로운 타입의 객체를 추가하거나 수정할 때, 객체 생성 로직만 팩토리 메서드에서 바꿔주면 되니 변경이 유연해요.
3. 캡슐화: 객체 생성 과정을 숨겨서 클라이언트 코드가 객체 생성 방식에 신경 쓸 필요 없이, 요청만 하면 팩토리가 적절한 객체를 제공해줘요.
내용 - 팩토리 메서드 패턴이란?
팩토리 메서드 패턴은 부모 클래스가 객체를 생성하는 방법에 대한 인터페이스를 제공하지만, 실제 객체의 생성은 자식 클래스에서 결정하는 생성 패턴입니다. 이 패턴을 사용하면 객체를 생성할 때 어떤 구체적인 클래스의 인스턴스를 만들지 신경 쓸 필요가 없고, 코드의 확장성을 높일 수 있습니다.
팩토리란?
팩토리라는 용어는 객체나 데이터를 "생산"하는 메서드나 클래스를 뜻합니다. 일반적으로 팩토리는 객체를 생성하는데 사용되지만, 파일 생성, 데이터베이스 레코드 등 다양한 작업을 할 수 있습니다.
단순 팩토리 패턴
단순 팩토리 패턴은 주어진 매개변수에 따라 적절한 클래스의 인스턴스를 생성하는 큰 조건문을 가진 하나의 메서드를 제공합니다. 이 패턴을 사용하면 클라이언트가 직접 객체를 생성하지 않고, 팩토리가 객체를 대신 생성해줍니다.
팩토리 메서드 생성 방법
1. 일방적인 객체를 생성할때처럼 부모 클래스와 자식 클래스를 생성한다
나는 Creature라는 부모클래스를 하나 만들고 Player , Monster라는 자식클래스를 만든다음 Player클래스를 상속받는 Knight, Archor 등등 을 만들고 Monster클래스를 상속받는 Minion, Voidling클래스 등등을 만들었다.
(취소선을 사용한 이유)
팩토리 메서드는 서로 다른타입을 넣지 않고 하나의 타입만 사용해야된다.
Player, Monster 둘다 Creature라는 상위 클래스를 상속받는다고 해도 본질적으로 하는 역할이 다르기 때문에 같이 사용하면 안된다. 둘다 팩토리 메서드를 사용할려면 Creature와 같이 Player나 Monster 의 부모클래스를 하나 더 생성해줘서 Creature는 Player타입의 팩토리 메서드를 생성하고 (새로만든)Creature2는 Monster타입의 팩토리 메서드를 생성하는 클래스로 만들어 줘야한다.
2. 부모클래스인 Creature 에서 생성할 객체 타입들을 집합을 만들어준다.
public enum CreatureType
{
Knight,
Archor,
Mage,
Minion,
Voidling,
CannonMinion
}
취소선을 사용한것도 다른타입이기 때문에 빼야된다.
3. 부모클래스인 Creature 에서 CreatureType 에 들어있는 정보들을 토대로 팩토리 메서드를 만들어 주면 된다.
public static Creature CreatureFactory(CreatureType creaturetype)
{
switch (creaturetype)
{
case CreatureType.Knight:
return new Knight();
case CreatureType.Archor:
return new Archor();
case CreatureType.Mage:
return new Mage();
case CreatureType.Minion:
return new Minion();
case CreatureType.Voidling:
return new Voidling();
case CreatureType.CannonMinion:
return new CannonMinion();
}
throw new System.NotSupportedException($"{creaturetype} 이라는 타입은 존재하지 않습니다");
}
위에있는 취소선도 마찬가지로 다른타입이기때문에 같이 사용하면 안된다.
코드의 팩토리 매서드 패턴 대한 설명
1. 팩토리 클래스 (Creature): CreatureFactory 메서드는 부모 클래스인 Creature에서 구현되었고, 이 메서드가 다양한 타입의 Creature 객체를 생성할 수 있습니다.
2. 서브 팩토리 클래스 (자식 클래스): Knight, Archor, Mage 같은 클래스들이 이 팩토리 메서드에서 실제로 생성되는 객체들입니다. 각각의 자식 클래스는 부모 클래스의 인터페이스를 따르면서 자신만의 특성을 가집니다. 예를 들어, Knight는 공격력, 방어력, 체력 등의 값이 다릅니다.
3. 다형성: 팩토리 메서드가 반환하는 객체는 부모 클래스인 Creature 타입이지만, 내부적으로는 각 자식 클래스(Knight, Mage 등)의 인스턴스입니다. 이를 통해 클라이언트는 생성된 객체가 어떤 구체적인 클래스인지 알 필요 없이, 공통된 인터페이스(Creature)를 통해 상호작용할 수 있습니다. (여기서 말하는 인터페이스는 객체를 생성하는 방법에 대한 기본적인 틀이나 규칙을 의미합니다.)
4. 유지보수 : 팩토리 메서드 패턴을 사용하면 새로운 클래스나 타입을 추가할 때 기존 팩토리 메서드를 수정할 필요가 없이 자식클래스를 하나 추가해서 만들고, CreatureType에 객체명 추가한 후에 팩토리 매서드에 추가해주기만 하면 된다.
작성한 팩토리 메서드 패턴 코드 피드백
지금 구현한게 Creature클래스에서 Monster타입이나 Player직업을 한번에 모아서 객체를 생성할 수 있게 만든거는 잘 만들었다고하셨는데 팩토리 메서드 패턴만 본다고 하면은 좀 잘못된 코드인거같다고 말씀하셨다.
어디가 문제였나면 첫번째로 Creature클래스에서 팩토리 메서드를 만들떄 Player 라는 타입과 Monster 라는 타입 두개를 사용하는데 보통적으로는 하나의 타입만 넣고 객체를 생성한다고 한다.