티스토리 뷰

디자인 패턴

02. 팩토리 메소드 패턴

jin-park 2022. 2. 10. 16:31

1.  의미

  • 인스턴스(객체) 생성에 대한 책임을 구체적인 클래스가 아닌 추상적인 인터페이스의 메소드를 이용하는 패턴
  • 변경에는 닫혀야있어야 하며 확장에는 열려있어야하는 원칙(OCP)을 준수해야한다

2.  작성 방법

  • 인터페이스와 인스턴스 생성용 메소드를 정의한다
  • JAVA9 이상의 경우 인터페이스에서 private 메소드를 정의할 수 있으나, JAVA8 버전의 경우는 인터페이스에 private 메소드를 정의할 수 없다. JAVA8을 사용한다면 abstract 클래스를 이용하여 필요한 메소드를 정의한다.

다이어그램
다이어그램

public interface ShipFactory {
    default Ship orderShip(String name, String email) {
        Ship ship = createShip();
        sendEmailTo(email, ship);
        return ship;
    }
 
    Ship createShip();
 
    void sendEmailTo(String email, Ship ship);
 
}
public abstract class DefaultShipFactory implements ShipFactory {
 
    @Override
    public void sendEmailTo(String email, Ship ship) {
        System.out.println(ship.getName() + " 다 만들었습니다.");
    }
}
public class WhiteShipFactory extends DefaultShipFactory {
 
    @Override
    public Ship createShip() {
        return new WhiteShip();
    }
}
public class Ship {
    private String name;
    private String color;
    private String logo;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getColor() {
        return color;
    }
 
    public void setColor(String color) {
        this.color = color;
    }
 
    public String getLogo() {
        return logo;
    }
 
    public void setLogo(String logo) {
        this.logo = logo;
    }
}
public class WhiteShip extends Ship {
 
    public WhiteShip() {
        setName("whiteShip");
        setColor("white");
        setLogo("dkt");
    }
}
public class Client {
 
    public static void main(String[] args) {
        Client client = new Client();
 
        client.print(new WhiteShipFactory(), "whiteShip", "a@mail.com");
        client.print(new BlackShipFactory(), "whiteShip", "a@mail.com");
    }
 
    private void print(ShipFactory shipFactory, String name, String email) {
        System.out.println(shipFactory.orderShip(name, email));
    }
}

4. 장점 및 단점

  • 장점 - 기존 코드를 변경하지 않으며 확장가능하다.
  • 단점 - 역할이 분할되어 있어 클래스가 계속 증가해야 한다.

위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.

백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.

https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

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

06. 어댑터 패턴  (0) 2022.02.10
05. 프로토타입 패턴  (0) 2022.02.10
04. 빌더패턴  (0) 2022.02.10
03. 추상 팩토리 패턴  (0) 2022.02.10
01. 싱글톤 패턴  (0) 2022.02.10
댓글