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;
}
}
🐾정리
팩토리 패턴은 성격이 같은 객체를 생성할 때 구체적인 객체 타입에 따른 생성 부분을 캡슐화시켜서
코드의 복잡도를 줄여준다.
디자인 패턴을 어떻게 활용하고 사용해야할 지 막막했는데 코드를 직접 짜보기도 하고, 필요에 의해서 책을 읽으니 쉽게 이해가 되는 걸 느꼈다.
포스팅을 하면서 다른 패턴들도 점점 익혀나가야겠다😆
※ 해당 포스팅은「패턴 그리고 객체지향적 코딩의 법칙(문우식 저)」책을 읽고 공부한 내용을 바탕으로 작성하였습니다.
'프로그래밍 > 디자인 패턴' 카테고리의 다른 글
[Design Pattern] 싱글턴 패턴 (Singleton Pattern) (0) | 2021.02.17 |
---|