728x90
차량에 따른 연료 주입 실습
기능 요구사항
우리 회사는 렌터카를 운영하고 있다. 현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다.
우리 회사는 고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. 이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다.차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다.
- 각 차량별 연비는 다음과 같다.
* Sonata : 10km/리터
* Avante : 15km/리터
* K5 : 13km/리터
프로그래밍 요구사항 - 1단계
- 상속과 추상 메소드를 활용한다.
- 위 요구사항을 if/else 절을 쓰지 않고 구현해야 한다.
이 요구사항을 만족하는 테스트 코드는 다음과 같다.
- 아래 테스트 코드에서 자동차 인스턴스를 생성할 때의 숫자는 자동차로 여행할 거리를 의미한다.
public class RentCompanyTest {
private static final String NEWLINE = System.getProperty("line.separator");
@Test
public void report() throws Exception {
RentCompany company = RentCompany.create(); // factory method를 사용해 생성
company.addCar(new Sonata(150));
company.addCar(new K5(260));
company.addCar(new Sonata(120));
company.addCar(new Avante(300));
company.addCar(new K5(390));
String report = company.generateReport();
assertThat(report).isEqualTo(
"Sonata : 15리터" + NEWLINE +
"K5 : 20리터" + NEWLINE +
"Sonata : 12리터" + NEWLINE +
"Avante : 20리터" + NEWLINE +
"K5 : 30리터" + NEWLINE
);
}
}
힌트
- 앞의 Coffee와 Tea의 예제와 같이 상속을 활용해 구현해야 한다.
- 공통 기능 구현을 담당할 Car 클래스를 추가한다. Car 클래스에 abstract를 활용한다.
public abstract class Car {
/**
* 리터당 이동 거리. 즉, 연비
*/
abstract double getDistancePerLiter();
/**
* 여행하려는 거리
*/
abstract double getTripDistance();
/**
* 차종의 이름
*/
abstract String getName();
/**
* 주입해야할 연료량을 구한다.
*/
double getChargeQuantity() {
return getTripDistance() / getDistancePerLiter();
}
}
프로그래밍 요구사항 - 2단계
- 인터페이스를 적용해 구현한다.
1. Factory Method Pattern 정의
Factory Pettern 종류
- 팩토리 메서드 패턴(Factory Method Pattern)
- 각각 다른 객체들이 필요할 때 사용 - 추상 팩토리 패턴(Abstract Factory Pattern)
- 서로 연관있는 객체들의 조합이 필요할 때 사용
이번 게시글에서는 실습 내용으로 다뤘던 팩토리 메서드 패턴(Factory Method Pattern)을 정리하고자 한다
팩토리 메서드 패턴이란?
팩토리 메서드 패턴(Factory method pattern)은 객체지향 디자인 패턴이다.
Factory method는 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며,
자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다.
부모(상위) 클래스 코드에 구체 클래스 이름을 감추기 위한 방법으로도 사용한다.
이번 실습 내용을 예로 들어보자
렌트카 회사에 Sonata, K5, Avante 3종류의 차를 보유하고 있다
Sonata, K5, Avante 차를 각각의 객체로 선언했을 때
차들의 객체 생성을 팩토리 클래스에 위임하는 것 이다
즉, 실제 객체 생성을 팩토리 클래스에서 처리하고 해당 객체를 리턴해주는 것이다
2. 구현
- Sonata, K5, Avante 객체 생성
public class Sonata extends Car {
public Sonata(double tripDistance){
this.tripDistance = tripDistance;
this.distancePerLiter = 10;
this.name = "Sonata";
}
@Override
public double getDistancePerLiter(){
return this.distancePerLiter;
}
@Override
public double getTripDistance(){
return this.tripDistance;
}
@Override
public String getName(){
return name;
}
}
public class K5 extends Car {
public K5(double tripDistance){
this.tripDistance = tripDistance;
this.distancePerLiter = 13;
this.name = "K5";
}
@Override
public double getDistancePerLiter(){
return this.distancePerLiter;
}
@Override
public double getTripDistance(){
return this.tripDistance;
}
@Override
public String getName(){
return name;
}
}
public class Avante extends Car {
public Avante(double tripDistance){
this.tripDistance = tripDistance;
this.distancePerLiter = 15;
this.name = "Avante";
}
@Override
public double getDistancePerLiter(){
return this.distancePerLiter;
}
@Override
public double getTripDistance(){
return this.tripDistance;
}
@Override
public String getName(){
return name;
}
}
- 차들을 관리할 일급 컬렉션 구현
import rentcompany.car.Car;
import rentcompany.car.Cars;
public class RentCompany {
private final Cars cars;
public RentCompany() {
this.cars = new Cars();
}
public static RentCompany create(){
return new RentCompany();
}
public void addCar(Car car){
this.cars.add(car);
}
public String generateReport(){
return this.cars.getReport();
}
}
728x90
'개발 교육 > 플레이그라운드 with TDD, 클린코드' 카테고리의 다른 글
Java8 실습 - Lamda, Stream, Optional (0) | 2022.04.07 |
---|---|
좌표계산기 구현 - 리팩토링 포함 (0) | 2022.03.26 |
자동차 경주 게임 구현 - 리팩토링 재시도 (0) | 2022.03.14 |
자동차 경주 게임 구현 (0) | 2022.03.12 |
TDD/리팩토링 실습 - 문자열 덧셈 계산기 (0) | 2022.03.09 |