반응형
생성 패턴 - 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();
}
}
반응형
'cs > java-spring-boot' 카테고리의 다른 글
[Zero-base] 11-6. 파사드(Facade) (0) | 2022.03.15 |
---|---|
[Zero-base] 11-5. 어댑터(Adaptor) (0) | 2022.03.15 |
[Zero-base] 11-3. 빌더(Builder) (0) | 2022.03.15 |
[Zero-base] 11-2. 싱글턴(Singleton) (0) | 2022.03.15 |
[Zero-base] 11-1. 디자인 패턴과 가독성 (0) | 2022.03.15 |