디자인 패턴의 항목 중 생성 패턴에 대해서 알아보겠습니다.
스터디 계기
개발을 진행하다 보면 디자인 패턴에 대해서 많이들 이야기하고 실제 많이 활용하는 경우가 많습니다. 하지만 정확히 알지 못하고 사용하게 된다면, 오히려 독이 될 수 있다고 판단하여, 디자인 패턴 하나씩 알아가 보며, 예제 파일을 만들어 보려고 합니다.
문제 상황
3D 컨텐츠를 모델링하고, 관리하는 앱을 개발하고 있다고 가정해 보겠습니다. 프로포 타입으로, FBX만 관리하고, 조작하며, 콘텐츠를 제작한다고 가정하고, 추후 확장하기 위해, Obj, Glb를 추가한다고 하였을 때, 새로운 Obj, Glb에 대한 클래스를 기존 프로그램에 추가하는 것은 매우 어렵습니다. 이 문제를 해결하기 위해 아래와같은 팩토리 메서드를 활용해볼 수있습니다.
팩토리 메서드
객체를 생성하는 코드를 서브 클래스에 위임하는 패턴으로, 상위 클래스에서는 행동(만드는 행위)을 상속해 주고, 이를 상속받은 서브 클래스에서, 어떤 유형을 만들지를 정한다고 생각하면 됩니다.
클래스 다이어그램
예시 코드
public abstract class AssetCreator
{
public abstract Asset CreateAsset(string path);
}
public class GlbCreator : AssetCreator
{
public override Asset CreateAsset(string path)
{
return new Glb(path);
}
}
public class FBXCreator : AssetCreator
{
public override Asset CreateAsset(string path)
{
return new FBX(path);
}
}
public class ObjCreator : AssetCreator
{
public override Asset CreateAsset(string path)
{
return new Obj(path);
}
}
상위 Class인 Asset Creator에서는 CreateAsset을 추상화하고, 상속받은 서브 클래스에서 어떤 객체를 생성할지를 결정하여 객체를 생성하는 패턴으로, 아래와 같이 활용하여 각기 다른 객체를 생성할 수 있습니다.
public class FactoryPatternSample : MonoBehaviour
{
private string FBXPath = "Assets/Model/Test.fbx";
private string ObjPath = "Assets/Model/Test.obj";
private string GlbPath = "Assets/Model/Test.glb";
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
//fbx
Asset asset = Create(FBXPath);
asset.Load();
//obj
asset = Create(ObjPath);
asset.Load();
//Glb
asset = Create(GlbPath);
asset.Load();
}
private Asset Create(string path)
{
AssetCreator creator;
if (path.EndsWith(".fbx"))
{
creator = new FBXCreator();
}
else if (path.EndsWith(".obj"))
{
creator = new ObjCreator();
}
else if ( path.EndsWith(".glb"))
{
creator = new GlbCreator();
}
else
{
throw new UnCreateAsset();
}
return creator.CreateAsset(path);
}
}
위와 같이 서브 클래스에서 어떤 객체를 생성할지 판단하여, 하나의 상위 클래스로 리턴 받아 활용할 수 있습니다.
FactoryMethod.unitypackage
0.00MB
예시 스크립트 패키지
'C#' 카테고리의 다른 글
[디자인 패턴] 생성 패턴 - 추상 팩토리 (0) | 2025.10.13 |
---|---|
[문법] ReadOnlySpan<char> 자료형 (2) | 2025.08.12 |
[문법] IFormatProvider (0) | 2025.08.04 |
[문법] String To int Parser (0) | 2025.07.15 |