[ 참고사이트 ]
https://ansohxxn.github.io/design%20pattern/chapter5/
1. 팩토리 매서드 패턴
- 객체 생성을 위한 추상 매서드를 제공하고, 실제 생성 로직은 서브 클래스에서 구현하는 방식.
- 부모는 생성만, 자식은 생성 방식을 담당.
- 유지 보수 시 부모 클래스를 수정할 필요없이 서브 팩토리 클래스의 내용을 수정하면 됨 = 유지 보수 편리
2. 구현
[ Car.cs ] - 자동차의 타입과 이름, 무게, 높이 그리고 생성 후 이동하는 함수 정의.
public abstract class Car : MonoBehaviour
{
public enum CarType
{
NONE = 0,
CASPER,
AVANTE,
SANTAFE
}
[SerializeField]
protected CarType type;
[SerializeField]
protected string name;
[SerializeField]
protected int weight;
[SerializeField]
protected int height;
public abstract void Move();
}
[ Casper.cs ] - 캐스퍼의 스탯과 이동함수 재정의.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Casper : Car
{
private void Awake()
{
Debug.Log(this.name + " : 생성" + " ,무게 : " + this.weight + ", 높이 : " + this.height);
}
public override void Move()
{
Debug.Log(this.name + " : 이동");
}
}
[ Avante.cs ] - 아반떼의 스탯과 이동함수 재정의.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Avante : Car
{
private void Awake()
{
Debug.Log(this.name + " : 생성" + " ,무게 : " + this.weight + ", 높이 : " + this.height);
}
public override void Move()
{
Debug.Log(this.name + " : 이동");
}
}
[ Santafe.cs ] - 싼타페의 스탯과 이동함수 재정의.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Santafe : Car
{
private void Awake()
{
Debug.Log(this.name + " : 생성" + " ,무게 : " + this.weight + ", 높이 : " + this.height);
}
public override void Move()
{
Debug.Log(this.name + " : 이동");
}
}
[ CarGenerator.cs ] - 자동차를 담을 리스트 생성, 자동차 타입을 매개변수로 가진 자동차 생성 함수 정의.
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class CarGenerator : MonoBehaviour
{
public List<Car> listCar = new List<Car>();
public List<Car> getCars()
{
return listCar;
}
public abstract void CreateCars(Car.CarType _type);
}
[ PatternGenerator.cs ] - 각 자동차의 프리팹 생성, 타입에 따른 자동차 생성함수 재정의.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PatternGenerator : CarGenerator
{
public GameObject prfCasper;
public GameObject prfAvante;
public GameObject prfSantafe;
public override void CreateCars(Car.CarType _type)
{
switch (_type)
{
case Car.CarType.NONE:
break;
case Car.CarType.CASPER:
GameObject objCasper = Instantiate(prfCasper);
Casper instanceCasper = objCasper.GetComponent<Casper>();
listCar.Add(instanceCasper);
break;
case Car.CarType.AVANTE:
GameObject objAvante = Instantiate(prfAvante);
Avante instanceAvante = objAvante.GetComponent<Avante>();
listCar.Add(instanceAvante);
break;
case Car.CarType.SANTAFE:
GameObject objSantafe = Instantiate(prfSantafe);
Santafe instanceSantafe = objSantafe.GetComponent<Santafe>();
listCar.Add(instanceSantafe);
break;
default:
break;
}
}
}
[ CarFactoryMethod.cs ] - 버튼을 누르면 리스트에 저장된 타입의 순서대로 생성 및 이동함수 호출.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CarFactoryMethod : MonoBehaviour
{
public CarGenerator carGenerators;
public void MakeType()
{
List<Car> listCars = carGenerators.getCars();
int cnt = 1;
for (int i = cnt; i <= 3; i++)
{
Car.CarType type = (Car.CarType)i;
carGenerators.CreateCars(type);
listCars[i - 1].Move();
}
}
}
'Unity > Unity 디자인 패턴' 카테고리의 다른 글
[Unity 디자인 패턴] 심플 팩토리 패턴(Simple Factory Pattern) (0) | 2024.04.25 |
---|---|
[Unity 디자인 패턴] 옵저버 패턴(Observer Pattern) (0) | 2024.04.22 |
[Unity 디자인 패턴] 컴포넌트(Component) 패턴 (0) | 2024.04.17 |
[Unity 디자인 패턴] 싱글톤(SingleTon)에 대해 알아보자! (0) | 2024.04.16 |