Java/디자인 패턴

[디자인 패턴] 팩토리 메서드

태감새 2023. 3. 2. 22:08

코딩으로 학습하는 GoF의 디자인 패턴

팩토리 메서드

구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정함
→ 다양한 구현체(Product)가 있고 특정 구현체를 만들 수 있는 다양한 팩토리(Factory)를 제공한다.

예제

Ship

@Data
public class Ship {  
    private String name;  
    private String color;  
    private String logo;  
    private String wheel;  
    private String anchor;
public class BlackShip extends Ship {  
    public BlackShip() {  
        setName("BlackShip");  
        setLogo("black");  
        setColor("⚓");  
    }  
}
public class WhiteShip extends Ship{  
    public WhiteShip() {  
        setName("whiteship");  
        setLogo("\uD83D\uDEE5️");  
        setColor("white");  
    }  
}

Factory

public interface ShipFactory {  

    default Ship orderShip(String name, String email) {  
        validate(name, email);  
        prepareTo(name);  
        Ship ship = createShip();  
        sendEmailTo(email, ship);  
        return ship;  
    }  

    Ship createShip();

    private void sendEmailTo(String email, Ship ship){
        System.out.println(ship.getName() + " 다 만들었습니다.");
    };    

    private void prepareTo(String name){  
        System.out.println(name + " 만들 준비 중");  
    };  

    private void validate(String name, String email){  
        if (name == null || name.isBlank()) {  
            throw new IllegalArgumentException("배 이름을 지어주세요.");  
        }  
        if (email == null || email.isBlank()) {  
            throw new IllegalArgumentException("연락처를 남겨주세요.");  
        }  
    };  
}
public class BlackShipFactory extends ShipFactory {  
    @Override  
    public Ship createShip() {  
        return new BlackShip();  
    }  
}
public class WhiteShipFactory extends ShipFactory {  
    @Override  
    public Ship createShip() {  
        return new WhiteShip();  
    }  
}

현재 예시에서 creator가 ShipFactory , ConcreteCreator는 BlackShipFactory, WhiteShipFactory
Product는 ship, ConcreteProduct는 BlackShip,WhiteShip이다.

 

BackShip과 WhiteShip은 Ship으로 추상화 되어있어서 ShipFactory에서 어떤 배든 받을 수 있다. 다른 배가 추가된다고 해도 Ship을 구현받으면 ShipFactory에서는 코드 변경없이 사용이 가능하다. Factory쪽은 새로운 Factory를 만들어서 마찬가지로 ShipFactory를 상속받으면 된다. 그리고 클라이언트는 새로운 Factory를 이용해서 주문을 넣으면 된다.

복습

  1. 팩토리 메서드 패턴을 적용했을 때의 장점은? 단점은?
    • 장점 : 확장에 열려있고 변경에 닫혀있다.
    • 단점 : 클래스가 많아지고 과정이 복잡해진다.
  2. "확장에 열려있고 변경에 닫혀있는 객체 지향 원칙"에 대해 설명하세요.
    • 확장에 열려있다는 말은 기능을 확장하는데 있어서 제한이 없어야 한다는 말이다. 기능은 추가하면 되니까 대부분은 확장에 열려있다. 변경에 닫혀있다는 말은 확장하는데 있어서 기존의 코드를 변경해서는 안된다는 말이다. 그래서 저 원칙이 하는 말은 기존의 코드는 그대로 유지하되 확장하라는 말이다. 위의 팩토리 메서드를 보면 새로운 배와 팩토리가 추가된다고 해서 배를 만드는 기존의 코드가 변경되지 않는다. 확장에는 열려있고 변경에는 닫혀있는 예시라고 보면 좋을 듯 하다.
  3. 자바 8에 추가된 default 메서드에 대해 설명하세요.
    • 원래 인터페이스에는 추상메서드만 정의가 가능했다. 일반적인 메서드를 사용하려면 인터페이스를 구현한 클래스를 이용해서 작성해야했다. default 메서드는 인터페이스 내에서 구현체를 가진 메서드를 의미한다. 자바 8에서 등장했으며 default메서드와 static 메서드를 인터페이스에 정의할 수 있게 되었다. 자바 9부터는 private 메서드까지 정의가 가능하도록 변경되었다.

'Java > 디자인 패턴' 카테고리의 다른 글

[디자인 패턴] 어댑터 패턴  (0) 2023.04.22
[디자인 패턴] 프로토타입 패턴  (0) 2023.04.20
[디자인 패턴] 빌더 패턴  (0) 2023.04.19
[디자인 패턴] 추상 팩토리  (0) 2023.03.02
[디자인 패턴] 싱글톤  (0) 2023.03.02