Factory Method

GamSa Ham·2022년 10월 3일
0

GoF디자인패턴

목록 보기
2/22
post-thumbnail

의도

  • 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 합니다.

다른 이름

  • 가상 생성자(Virtual Constructor)

활용성

  • 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
  • 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
  • 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브 클래스가 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화 시키고 싶을때

구조

결과

  • 팩토리 메서드 패턴은 응용프로그램에 국한된 클래스가 여러분의 코드에 종속되지 않도록 해줍니다.
package study.designpattern;

class Maze {}
class Room {}
class Wall {}
class Door {}

// makeMake, makeRoom, makeWall, makeDoor 항목이 팩토리 메서드입니다.
public class MazeGame {
    public Maze makeMaze() {
        return new Maze();
    }

    public Room makeRoom() {
        return new Room();
    }

    public Wall makeWall() {
        return new Wall();
    }

    public Door makeDoor() {
        return new Door();
    }

    public MazeGame createMaze() {
        Maze maze = this.makeMaze();
        Room room = this.makeRoom();
        Wall wall = this.makeWall();
        Door door = this.makeDoor();

        return this;
    }

    public static void main(String[] args) {
        MazeGame mazeGame = new MazeGame().createMaze();
    }
}

class BombedWall extends Wall {

}

class RoomWithBomb extends Room{

}

// 팩토리 메소드 클래스 상속
class BombedMazeGame extends MazeGame {

    BombedMazeGame() {
    }

    @Override
    public Wall makeWall() {
        return new BombedWall();
    }

    @Override
    public Room makeRoom() {
        return new RoomWithBomb();
    }

}

책에서 정의된 기본 생성자 패턴의 예시

아래 구문은 활용한 예시입니다.

SOLID 항목에

장점: SRP(Single Responsibility Principle 단일책인원칙) 수정에는 닫혀있고 확장에는 열려있다. OCP(Open-Close principle) 계방폐쇠원칙 을 지킬수 있다.

단점: 서브 클래스를 정의해야해서 코드량이 증가한다.

정적 팩토리 메서드 패턴

GoF디자인 패턴 중 팩토리 패턴에서 유래한 이 단어는 객체를 생성하는 역할을 분리하겠다는 취지가

예시는 자바에 LocalDate 클래스에서 찾아볼수 있다.

public static LocalDate of(int year, Month month, int dayOfMonth) {
YEAR.checkValidValue(year);
    Objects.requireNonNull(month, "month");
DAY_OF_MONTH.checkValidValue(dayOfMonth);
    returncreate(year, month.getValue(), dayOfMonth);
}

이팩티브 자바 항목에서 생성자 대신 정적 팩토리 메서드를 고려하라 구문이 있다.

profile
안녕하세요. 자바를 좋아하고 디자인 패턴, Refactoring, Clean Code에 관심이 많은 백엔드 개발자입니다.

0개의 댓글