의도
다른 이름
활용성
구조
결과
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);
}
이팩티브 자바 항목에서 생성자 대신 정적 팩토리 메서드를 고려하라 구문이 있다.