- 팩토리 메서드란
- 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡길수 있다.
- 자주 변화가 있는 부분을 밖으로 빼낸다.
- 팩토리메서드의 장점
- 기존의 인스턴스를 만든는 코드를 변경하지 않고 같은 류의 새로운 인스턴스를 생성 또는 확장이 가능하다.(OOP의 5대원칙중 하나인 개방 폐쇄 원칙 (Open-Closed Principle, OCP)를 만족하게 한다.)
- 느슨한 결합을 만들수 있다.
- 팩토리 메서드의 단점
- 역할분담을 위해서 클래스가 많아진다.
기존의 코드
기존의 팩토리 코드
public class ShipFactory { //새로운 기능을 넣을려면 코드가 고쳐져야한다. 변경에 닫혀져있는 객체지향의 원치 위반 만들어지는 과정이 이리저리 산만해서 코드 가독성이 떨어진다. 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() + " 다 만들었습니다."); } }
팩토리 메서드 적용후
생성자를 제외한 빼고 나머지를 인터페이스로 빼버린다.
**public interface ShipFactory { default Ship orderShip(String name, String email){ validate(name,email); prepareFor(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 validate(String name,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 + " 만들 준비 중"); } }**
Ship createShip()을 구현체에서 구현을 해준다.
기능을 확장을 할때에 기존코드를 안건들이고 확장이 가능하다.


'디자인 패턴' 카테고리의 다른 글
[디자인패턴] 싱글톤(Singleton) 패턴 (0) | 2022.04.10 |
---|---|
[디자인패턴] 빌더(Builder)패턴 (0) | 2022.04.08 |
커맨드 패턴 (0) | 2021.12.21 |