#15 Factory pattern

Yumin·2025년 1월 29일

Computer Science

목록 보기
15/17

팩토리 패턴은 객체 생성 로직을 분리하여 유연성과 확장성을 높이는 디자인 패턴입니다. 객체 생성 과정을 캡슐화함으로써 클라이언트 코드가 구체적인 클래스에 의존하지 않도록 합니다. 주로 다음과 같은 상황에서 사용됩니다:

객체 생성이 복잡할 때

다양한 유형의 객체를 생성해야 할 때

코드의 재사용성과 유지보수성을 높이고 싶을 때

팩토리 패턴은 크게 Simple Factory, Factory Method, Abstract Factory 세 가지 유형으로 나뉩니다.

  1. Simple 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");
  1. Factory Method (팩토리 메소드 패턴)
    목적: 자동차 생성을 서브클래스에 위임하여 확장성을 제공합니다.

특징: 각 서브클래스가 자신이 생성할 자동차의 유형을 결정합니다.

예시 코드:

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();
  1. Abstract Factory (추상 팩토리 패턴)
    목적: 관련 있는 여러 객체(예: 자동차 + 엔진)를 군(Group) 단위로 생성합니다.

특징: 제품군(예: 자동차와 엔진)의 조합을 생성합니다.

예시 코드:

// 제품 인터페이스
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.

profile
일본 게임회사에서 클라이언트 엔지니어로 활동중

0개의 댓글