1) 생성패턴
팩토리 패턴은 객체를 생성하기 위한 패턴 중 하나입니다. 객체를 생성하는 코드를 별도의 클래스/메서드로 분리하여, 객체 생성 코드의 변경이나 유지보수를 용이하게 합니다.
즉, 객체를 생성하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)을 낮추어 코드를 건드리는 횟수를 최소화 하는 패턴이다!
(클라이언트 코드는 분리시킨 객체 생성 코드를 호출하는 쪽)
팩토리 패턴은 객체 생성 코드를 별도의 클래스로 분리하므로, 객체 생성 코드의 변경이나 유지보수를 용이하게 할 수 있습니다. 예를 들어, 캐릭터를 생성하는 코드가 있다고 가정하면
public class Character {
private String name;
private int level;
public Character(String name, int level) {
this.name = name;
this.level = level;
}
}
public class GameManager {
public static void main(String[] args) {
Character player1 = new Character("Player 1", 10);
Character player2 = new Character("Player 2", 5);
// ...
}
}
만약 캐릭터 객체 생성 코드에 변경이 생긴다면, 모든 코드에서 해당 부분을 일일이 수정해야 한다. 이를 팩토리 패턴을 이용해 개선할 수 있다.
public abstract class CharacterFactory {
public abstract Character createCharacter(String name, int level);
}
public class PlayerFactory extends CharacterFactory {
public Character createCharacter(String name, int level) {
return new Character(name, level);
}
}
public class GameManager {
public static void main(String[] args) {
CharacterFactory factory = new PlayerFactory();
Character player1 = factory.createCharacter("Player 1", 10);
Character player2 = factory.createCharacter("Player 2", 5);
// ...
}
}
팩토리 패턴을 이용하면, 객체 생성 코드를 별도의 클래스로 분리하여 수정이 용이하다. 또한, 객체 생성 코드를 확장하기 쉬워지므로, 캐릭터 생성 코드 외에도 다른 종류의 객체를 생성하는 코드를 추가하기 쉬워짐!
팩토리 패턴과 팩토리 메서드 패턴은 객체 생성을 위한 패턴으로 매우 유사하지만 팩토리 패턴은 객체를 생성하는 메서드를 별도의 클래스로 분리하여, 객체 생성 코드의 변경이나 유지보수를 용이하게 한다.
팩토리 메서드 패턴은 객체 생성 코드를 Creator 클래스 안에 있는 팩토리 메서드로 분리하며, 이를 상속받은 클래스에서 구체적인 객체 생성 코드를 구현한다. 따라서, 팩토리 패턴은 Creator와 ConcreteCreator를 분리하는 반면, 팩토리 메서드 패턴은 Creator 클래스와 이를 상속받은 클래스를 분리한다.
추상화 수준이 높은 클래스를 만들기 위해서는 객체 생성과 관련된 로직을 분리하는 것이 좋다. 또한, 객체 생성 코드가 변경될 가능성이 높거나, 객체 생성 코드가 복잡할 경우에도 팩토리 패턴을 사용할 수 있다. 팩토리 패턴은 많은 디자인 패턴에서 사용되며, 가장 기본적인 디자인 패턴 중 하나이다.