팩토리 패턴은 객체 생성 로직을 분리하여 유연성과 확장성을 높이는 디자인 패턴입니다. 객체 생성 과정을 캡슐화함으로써 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 합니다. 주로 다음과 같은 상황에서 사용됩니다:
객체 생성이 복잡할 때
다양한 유형의 객체를 생성해야 할 때
코드의 재사용성과 유지보수성을 높이고 싶을 때
팩토리 패턴은 크게 Simple Factory, Factory Method, Abstract Factory 세 가지 유형으로 나뉩니다.
특징: if/else 또는 switch 문을 사용하여 자동차 유형을 결정합니다.
예시 코드:
public class CarFactory {
public Car CreateCar(string type) {
switch (type) {
case "sedan":
return new Sedan();
case "suv":
return new SUV();
case "truck":
return new Truck();
default:
throw new ArgumentException("Invalid car type");
}
}
}
사용 예시:
CarFactory factory = new CarFactory();
Car sedan = factory.CreateCar("sedan");
Car suv = factory.CreateCar("suv");
특징: 각 서브클래스가 자신이 생성할 자동차의 유형을 결정합니다.
예시 코드:
public abstract class CarFactory {
public abstract Car CreateCar();
}
public class SedanFactory : CarFactory {
public override Car CreateCar() {
return new Sedan();
}
}
public class SUVFactory : CarFactory {
public override Car CreateCar() {
return new SUV();
}
}
public class TruckFactory : CarFactory {
public override Car CreateCar() {
return new Truck();
}
}
사용 예시:
CarFactory factory = new SedanFactory();
Car sedan = factory.CreateCar();
factory = new SUVFactory();
Car suv = factory.CreateCar();
특징: 제품군(예: 자동차와 엔진)의 조합을 생성합니다.
예시 코드:
// 제품 인터페이스
public interface ICar {
void Drive();
}
public interface IEngine {
void Start();
}
// 구체적인 제품
public class Sedan : ICar {
public void Drive() => Console.WriteLine("Sedan is driving.");
}
public class SUV : ICar {
public void Drive() => Console.WriteLine("SUV is driving.");
}
public class V6Engine : IEngine {
public void Start() => Console.WriteLine("V6 Engine started.");
}
public class V8Engine : IEngine {
public void Start() => Console.WriteLine("V8 Engine started.");
}
// 추상 팩토리
public abstract class CarFactory {
public abstract ICar CreateCar();
public abstract IEngine CreateEngine();
}
// 구체적인 팩토리
public class SedanWithV6Factory : CarFactory {
public override ICar CreateCar() => new Sedan();
public override IEngine CreateEngine() => new V6Engine();
}
public class SUVWithV8Factory : CarFactory {
public override ICar CreateCar() => new SUV();
public override IEngine CreateEngine() => new V8Engine();
}
사용 예시:
CarFactory factory = new SedanWithV6Factory();
ICar sedan = factory.CreateCar();
IEngine engine = factory.CreateEngine();
sedan.Drive(); // 출력: Sedan is driving.
engine.Start(); // 출력: V6 Engine started.
factory = new SUVWithV8Factory();
ICar suv = factory.CreateCar();
IEngine powerfulEngine = factory.CreateEngine();
suv.Drive(); // 출력: SUV is driving.
powerfulEngine.Start(); // 출력: V8 Engine started.
