public static Ship orderShip(String name, String email) {
// validate
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("배 이름을 지어주세요.");
}
if (email == null || email.isBlank()) {
throw new IllegalArgumentException("연락처를 남겨주세요.");
}
prepareFor(name);
Ship ship = new Ship();
ship.setName(name);
// Customizing for specific name
if (name.equalsIgnoreCase("whiteship")) {
ship.setLogo("\uD83D\uDEE5️");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setLogo("⚓");
}
// coloring
if (name.equalsIgnoreCase("whiteship")) {
ship.setColor("white");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setColor("black");
}
// notify
sendEmailTo(email, ship);
return ship;
}
장점 : 클래스 하나로 사용 가능하다.
단점 : 먼저 새로운 클래스를 만들 때마다 새로운 로직을 기존 코드에 적용해야 하며 한 개의 파일에 내용이 길어지며 중복 요소가 존재한다.
public interface ShipFactory {
default Ship orderShip(String name, String email) {
validate(name, email);
prepareFor(name);
Ship ship = createShip();
sendEmailTo(email, ship);
return ship;
}
}
public class ShipFactory {
public static Ship orderShip(String name, String email) {
.
.
.
// coloring
if (name.equalsIgnoreCase("whiteship")) {
ship.setColor("white");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setColor("black");
} else if(name.equalsIgnoreCase("redship")){
ship.setColor("red");
}
.
.
.
}
public class WhiteShipFactory implements ShipFactory {
@Override
public Ship createShip() { // 만드는 방법 오버라이드
return new WhiteShip();
}
}
public class WhiteShip extends Ship{
public WhiteShip() { //생성자로 배 기본정보 저장
setName("whiteship");
setLogo("\uD83D\uDEE5");
setColor("white");
}
}
BeanFactory xmlFactory = new ClassPathXmlApplicationContext("context.xml");
String hello1 = xmlFactory.getBean("hello", String.class);
System.out.println("xmlFactory hello = " + hello1);
출처 : 백기선님의 디자인패턴