[Design Pattern] 팩토리 패턴 (Factory Pattern)

2021. 2. 15. 21:55프로그래밍/디자인 패턴

반응형

📚 팩토리 패턴은 왜 등장하게 됐을까?

예시) 

1. 프레임워크를 개발하게 됐다. 

   데이터베이스는 MSSql, Oracle 을 지원하고 향후 다른 DB종류가 추가될 가능성이 있다.

   

 2. MSSql, Oracle용 DB Helper클래스를 만들었다.

 

 3. DB Helper를 사용하는 시점에 DB종류에 따라

    MSSql이면 MSSql클래스 객체를, Oracle이면 Oracle클래스 객체를 생성해줬다.

 

switch(DBType)
{
    case("MSSQL") : 
     ... = new SqlDBHelper();
     break;
    case("ORACLE"): 
     ... = new OracleDBHelper();
     break;
    
    // DB 추가될 수 있음
}

 

 위와 같이 객체를 생성해서 사용하고 있을 때 또다른 DB종류가 추가된다면 어떻게 해야할까?

이미 여러군데에서 위와 같은 코드로 DBHelper 객체를 생성해서 사용하고 있다.

그렇다면 DBHelper 객체를 생성해야하는 모든 부분에 case문을 추가해줘야 할 것이다.

 

 결과적으로는 DBHelper와 DB종류별 DBHelper클래스를 사용하는 부분은 직접적인 연관을 가지게 되고, DBHelper 객체를 사용하는 부분이 늘어날 때마다 모든 DB종류별 Helper클래스를 알아야 하므로 복잡도가 증가된다.

 

이런 경우 팩토리 패턴을 사용할 수 있다.

 

📖 팩토리 패턴 사용하기

 - 팩토리 패턴은 서로 관련성이 있거나 책임이 같은 클래스들을 생성해주는 클래스를

  객체 생성 과정의 중간에 두어 복잡도를 줄이는 방법이다.

 

    ----(입력)----> 팩토리 class ----(출력)---->

 

 - 팩토리 클래스가 모든 객체 생성을 대신한다.

 

 - 어떤 객체 타입을 선택했는지 파라미터로 팩토리 클래스에 넘겨주면, 팩토리 클래스는 파라미터에 맞는 적절한 클래스를 new로 생성하여 넘겨준다.

 

 - 이 경우 모든 리턴되는 객체의 타입은 팩토리가 알고 있는 모든 클래스의 부모 클래스를 사용한다.

   (부모클래스 혹은 구현한 인터페이스 형태로 변환한다.)

 

 - 팩토리 클래스의 Create함수는 보통 static으로 선언한다. 

 

// 사용 예   
IDBHelper helper = DbHelperFactory.CreateDbHelper("MSSQL");
public static class DbHelperFactory
{		
    public static IDBHelper CreateDbHelper(string dbType)
    {
        IDBHelper helper = null;
        switch (dbType)
        {
            case "MSSQL" : helper = new SqlDBHelper(); break;
            case "ORACLE": helper = new OracleDBHelper(); break;
        }
        if (helper == null) throw new Exception("cannot create db helper instance.");		

        return helper;
    }
}

 

🐾정리

 팩토리 패턴은 성격이 같은 객체를 생성할 때 구체적인 객체 타입에 따른 생성 부분을 캡슐화시켜서

 코드의 복잡도를 줄여준다.

 

 디자인 패턴을 어떻게 활용하고 사용해야할 지 막막했는데 코드를 직접 짜보기도 하고, 필요에 의해서 책을 읽으니 쉽게 이해가 되는 걸 느꼈다. 

 포스팅을 하면서 다른 패턴들도 점점 익혀나가야겠다😆

 

 

 

 

 

 

※ 해당 포스팅은「패턴 그리고 객체지향적 코딩의 법칙(문우식 저)책을 읽고 공부한 내용을 바탕으로 작성하였습니다.

반응형