본문 바로가기

디자인 패턴

[디자인 패턴] 팩토리 메서드 패턴(Factory Method Pattern)

기존에 프로젝트 DB로 MySQL을 채택한 상황에서 MSSQL을 사용해야 될 때는 어떻게 해야 할까? 확장성을 고려하지 않고 그저 기능 구현에만 집중한 코드를 사용했을 경우 전체적으로 코드를 수정해야 한다. 이러한 경우 개방 폐쇄 원칙에 위배가 되므로 처음 코드를 구현할 때 확장성에 대해 잘 계획하여야 한다.

팩토리 메서드 패턴

 

https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4

객체 구현을 담당하는 클래스를 따로 두어 결합도를 낮추는 방법이다.

구현

아래 코드는 간단한 예제를 보여주기 위한 코드로 실제 작동은 되지 않는다. 

public interface ConnectorFactory{
    public Connection connect();

}

ConnectorFactory는 Creator로 볼 수 있고 User는 interface의 매개변수와 함수 이름을 통해 구체적인 구현 코드를 분석하지 않고도 기능을 파악하여 사용가능하다. interface를 사용하지 않고 Class를 사용하여도 구현 가능하다.

class MySQLConnector extends ConnectorFactory{
    public Connection connect(){
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("url", "user", "password");
        return conn;
    }
}
class MSSQLConnector extends ConnectorFactory{
    public Connection connect(){
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        return conn;
    }
}

실제 Connector 구현 부분은 ConcreteCreator 라고 할 수 있다.

ConnectorFactory connectorFactory = new MySQLConnector();
Connection connection = connectorFactory.connect();
ConnectorFactory connectorFactory = new MSSQLConnector();
Connection connection = connectorFactory.connect();

실제 사용시에는 ConnectorFactory의 생성자 부분만 바꿔주며 사용가능하다. 사실 이 부분도 코드의 수정이 일어났기 때문에 개방 폐쇄 원칙에 위배된다. 이 부분도 외부에서 의존성을 주입해주면 해결이 가능하긴 하다.

장점

  • 개방 폐쇄 원칙을 지켜서 확장에 용이하다.

단점

  • 확장이 되지 않은 상태에서 단순히 기능만 구현하는 것보다 복잡하다.
  • 확장이 되면 될 수록 관리해야 하는 Class 수가 늘어난다.