팩토리 패턴과 빌더 패턴을 합친 코드
빌더 패턴은 그냥 특정 생성자를 수동으로 Set할수 있고,
팩토리 패턴은 객체를 생성하는 것을 담당으로 하는 class가 있다는 것을 기억하면
이해가 쉽다
public class ObjectFactory
{
public class FactoryBuilder
{
public GameObject Obj;
public FactoryBuilder SetPosition(Vector2 newPos)
{
Obj.Position = newPos;
return this;
}
public FactoryBuilder SetName(string name)
{
Obj.Name = name;
return this;
}
public GameObject Return()
{
return Obj;
}
}
private FactoryBuilder _builder = new FactoryBuilder();
public FactoryBuilder Instantiate<T>() where T : GameObject, new()
{
_builder.Obj = new T();
Console.WriteLine($"{_builder.Obj.GetType().Name}");
return _builder;
}
}
public class Monster : GameObject
{
public Monster()
{
Console.WriteLine("자식생성자");
}
public override void Init()
{
Console.WriteLine("Monster Init");
}
}
public class GameObject
{
public string Name { get; set; }
public Vector2 Position { get; set; }
protected GameObject()
{
Console.WriteLine("부모 생성자");
Init();
}
public virtual void Init() //사물마다 다른 init필요(몬스터는 hp초기화, 사물은 안해도됨)
{
Console.WriteLine("Gameobject Init");
}
}
public struct Vector2
{
public float X { get; set; }
public float Y { get; set; }
public Vector2(float x, float y)
{
X = x;
Y = y;
}
}
static void Main(string[] args)
{
ObjectFactory factory = new ObjectFactory();
GameObject firstMonster = factory.Instantiate<Monster>().Return(); //팩토리패턴 + 빌더패턴 클래스의 Return으로 반환
GameObject secondMonster = factory.Instantiate<Monster>() //팩토리+빌더패턴으로 특정값 Set하고 Return
.SetPosition(new Vector2(7, 9))
.SetName("Goblin")
.Return();
}