반응형

생성 패턴 - Factory Method

 

해결하려는 문제

  • 복잡한 객체 생성을 캡슐화 해야함
  • 생성은 다른 클래스(Factory)에게 위임하려함
  • 어떤 인스턴스를 만들어야 할지 알 수 없음

 

 


심플 팩토리

  • 팩토리를 여러개 사용
public class Main {
    public static void main(String[] args) {
        
        //bean
        CarFactory = new CarFactory();
        
        //service
        {
            Car electricCar = factory.creatCar(EnginType.ELECTRIC);
            electricCar.whatIsCar();

            Car dieselCar = factory.creatCar(EnginType.DIESEL);
            dieselCar.whatIsCar();

            Car hydrogenCar = factory.creatCar(EnginType.HYDROGEN);
            hydrogenCar.whatIsCar();
        }
    }
}
public enum EngineType {
    ELECTRIC, DIESEL, HYDROGEN;
    
    public boolean isElectric() {
        return this == ELECTRIC;
        
    public boolean isDiesel() {
        return this == DIESEL;
        
    public boolean isHydrogen() {
        return this == HYDROGEN;
}
public class Car {
}
public class CarFactory {

    public Car createCar(EngineType electric) {
    
        if (electric.isElectric())
            return new ElectricCar();
            
        if (electric.isDiesel())
            return new DieselCar();
            
        if (electric.isHydrogen())
            return new HydrogenCar();
            
        throw new RuntimeException("엔진이 정의되지 않음");
    }
}
public interface Car {
    void whatIsCar();
}
public class ElectricCar implements Car {
    @Override
    public void whatIsCar() {
        System.out.println(getClass().getSimpleName());
    }
}
public class DieselCar implements Car {
    @Override
    public void whatIsCar() {
        System.out.println(getClass().getSimpleName());
    }
}
public class HydrogenCar implements Car {
    @Override
    public void whatIsCar() {
        System.out.println(getClass().getSimpleName());
    }
}

 

 


또다른 팩토리

  • 하나의 추상 팩토리를 사용함
public class Main {
    public static void main(Sting[] args) {
    
        AbstractCarFactory electricCarFactory = new ElectricCarFactory();
        Car electricCar = electricCarFactory.createCar();
        electricCar.whatIsCar();
        
        AbstractCarFactory dieselCarFactory = new DieselCarFactory();
        Car dieselCar = dieselCarFactory.createCar();
        dieselCar.whatIsCar();
        
        AbstractCarFactory hydrogenCarFactory = new HydrogenCarFactory();
        Car hydrogenCar = hydrogenCarFactory.createCar();
        hydrogenCar.whatIsCar(); 
    }
}
public abstract class AbstractCarFactory {
    public abstract Car createCar();
}
public class ElectricCarFactory extends AbstractCarFactory {
    @Override
    public Car createCar() {
        return new ElectricCar();
    }
}
public class DieselCarFactory extends AbstractCarFactory {
    @Override
    public Car createCar() {
        return new DieselCar();
    }
}
public class HydrogenCarFactory extends AbstractCarFactory {
    @Override
    public Car createCar() {
        return new HydrogenCar();
    }
}

 

 

 


반응형

+ Recent posts