728x90
반응형
- 아무리 변경해도 코드가 같아야함
Whiteshipfactory.class |before
public class WhiteshipFactory {
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("whiteship");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setColor("black");
}
// notify
sendEmailTo(email, ship);
return ship;
}
private static void prepareFor(String name) {
System.out.println(name + " 만들 준비 중");
}
private static void sendEmailTo(String email, Ship ship) {
System.out.println(ship.getName() + " 다 만들었습니다.");
}
}
ShipFactory.class
public interface ShipFactory{
default ship orderShip(String name, String email){
validate(name,email);
prepareFor(name);
Ship ship = createShip();
sendEmailTo(email, ship);
return
}
private void sendEmailTo(String email, Ship ship) {
System.out.println(ship.getName() + " 다 만들었습니다.");
}
Ship createShip();
private void validate(String email){
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("배 이름을 지어주세요.");
}
if (email == null || email.isBlank()) {
throw new IllegalArgumentException("연락처를 남겨주세요.");
}
}
private void prepareFor(String name) {
System.out.println(name + " 만들 준비 중");
}
}
Whiteship.class
public class Whiteship extends ship{
public WhiteShip(){
setName("Whiteship");
setLogo("\uD83D\uDEE5️");
setColor("white");
}
}
WhiteshipFactory.class | after
public class WhiteshipFactory implements ShipFactory{
@Override
public Ship createShip(){
return new Whiteship();
}
}
- 화이트 쉽에서 일단은 그냥 인스턴스 생성만 해줌
Client.java | before
public class Client {
public static void main(String[] args) {
Ship whiteship = ShipFactory.orderShip("Whiteship", "oksos0817@naver.com");
System.out.println(whiteship);
Ship blackship = ShipFactory.orderShip("Blackship", "oksos0817@naver.com");
System.out.println(blackship);
}
}
Client.java | after
public class Client {
public static void main(String[] args) {
Client client = new Client();
Ship whiteship = new WhiteshipFactory().orderShip("Whiteship","oksos@naver.com");
}
}
- 이렇게 됬을때 Blackship을 추가할때 소스가 바뀌나 안바뀌나 이것이 포인트
- 변경에 닫혀있고 확장에 열려있는 구조라면 새로운 배를 만드는 공정을 추가시 기존 코드 변경되면 안됨
Blackship.java
public class Blackship extends Ship{
public Blackship(){
setName("Blackship");
setLogo("⚓");
setColor("black");
}
}
BlackshipFactory.java
public class BlackshipFactory implements ShipFactory{
@Override
public Ship createShip(){
return new Blackship();
}
}
- 이렇게 하면 확장에 열려있고 변경에 닫혀있게됨
Client.java
public class Client {
public static void main(String[] args) {
Client client = new Client();
Ship whiteship = new WhiteshipFactory().orderShip("Whiteship","oksos@naver.com");
Ship black = new BlackshipFactory().orderShip("Blackship","oksos0817@naver.com");
}
}
- 단 클라이언트 코드가 바꼈는데 이게 변경에 닫혀있는것이 맞는지?
- 구체적 클래스 의존성 주입하는 방식을 쓰면 Client 최대한 고치지 않고 하는 법이 있음
728x90
반응형
'CS Study > 디자인패턴' 카테고리의 다른 글
2021.11.18_팩토리메소드패턴04.장점과단점 (0) | 2021.11.18 |
---|---|
2021.11.18_팩토리메소드패턴03.인터페이스적용하기 (0) | 2021.11.18 |
2021.11.15_팩토리메소드패턴01.패턴소개 (0) | 2021.11.15 |
2021.11.14_05.자바와스프링에서찾아보는패턴 (0) | 2021.11.14 |
2021.11.14_04.안전하고단순하게구현하는방법 (0) | 2021.11.14 |
댓글